1289 大魚吃小魚(51nod)解題報告
阿新 • • 發佈:2018-12-14
有N條魚每條魚的位置及大小均不同,他們沿著X軸遊動,有的向左,有的向右。遊動的速度是一樣的,兩條魚相遇大魚會吃掉小魚。從左到右給出每條魚的大小和遊動的方向(0表示向左,1表示向右)。問足夠長的時間之後,能剩下多少條魚?
Input
第1行:1個數N,表示魚的數量(1 <= N <= 100000)。 第2 - N + 1行:每行兩個數A[i], B[i],中間用空格分隔,分別表示魚的大小及遊動的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
Output
輸出1個數,表示最終剩下的魚的數量。
Input示例
5
4 0
3 1
2 0
1 0
5 0
Output示例
2
這個簡單模擬題 寫得有點久啊,太蒻了
/* 1289 */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; #define ll long long const int N=1e5+10; double len[N]; int vis[N]; double edg[N]; int main() { int n; scanf("%d",&n); memset(edg,0,sizeof(edg));//裡面存的是魚的長度 for(int i=0;i<n;i++) { scanf("%lf %d",&len[i],&vis[i]); } int ans=0;//計算被吃的魚 int id=0; for(int i=0;i<n;i++) { if(vis[i])//將vis是1的放入edg陣列中 { edg[++id]=len[i]; } if(id>0&&vis[i]==0) //所有的吃與被吃的操作都在這裡面 { /* if(len[i]>edg[id]) //右吃左 haiyaojixu { ans++; edg[id]=len[i]; } */ //下面只是對edg裡的魚,和len[i]的的操作,且edg放的都是向右的魚 //情況1 往左的魚一進來就被吃 --下面的if語句 //2 往左的魚沒有把向右的魚全吃掉--執行while後,edg[id]所代表的魚就是吃掉len[i]的魚,但while中沒有計算len[i], // 故在if中將ans++; //3 往左的魚所有的向右的魚吃掉-- 執行while後,id=0,不會執行if(len[i]<edg[id)這部分 while(len[i]>edg[id]&&id>0) { edg[id]=0; ans++; id--; } if(len[i]<edg[id]) //左吃右,進入下一個for { ans++; continue; } } } printf("%d\n",n-ans); return 0; }