生活随笔
收集整理的這篇文章主要介紹了
栈+模拟(大鱼吃小鱼)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#大魚吃小魚
有N條魚每條魚的位置及大小均不同,他們沿著X軸游動(dòng),有的向左,有的向右。游動(dòng)的速度是一樣的,兩條魚相遇大魚會(huì)吃掉小魚。從左到右給出每條魚的大小和游動(dòng)的方向(0表示向左,1表示向右)。問足夠長(zhǎng)的時(shí)間之后,能剩下多少條魚?
##Input
第1行:1個(gè)數(shù)N,表示魚的數(shù)量(1 <= N <= 100000)。
第2 - N + 1行:每行兩個(gè)數(shù)A[i], B[i],中間用空格分隔,分別表示魚的大小及游動(dòng)的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
##Output
輸出1個(gè)數(shù),表示最終剩下的魚的數(shù)量。
##Input示例
5
4 0
3 1
2 0
1 0
5 0
##Output示例
2
####問題分析:
此題在分析后采用棧這種存儲(chǔ)結(jié)構(gòu)較為簡(jiǎn)單,但需要注意的是只有當(dāng)棧頂魚向右而將要進(jìn)棧的魚向左時(shí)才會(huì)發(fā)生大魚吃小魚的情況,其他的都只需要將將要進(jìn)棧的魚壓入棧頂即可,因?yàn)椴粫?huì)發(fā)生大魚吃小魚的情況,讀者可自行在紙上模擬
####AC代碼:
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
typedef struct{int fi;int flag;
}fish; //定義魚這種結(jié)構(gòu)體
int main()
{int n;stack<fish> s;while(~scanf("%d",&n)){fish f;for(int i = 1;i<=n;i++){scanf("%d%d",&f.fi,&f.flag);if(s.empty()){ //如果棧為空,直接將新的魚壓入 s.push(f);continue;}fish a = s.top();int sign = 1; while(a.flag == 1 && f.flag == 0){//如果出現(xiàn)了即將進(jìn)棧的魚與棧頂魚發(fā)生沖突(大魚吃小魚) if(a.fi>f.fi){ //如果棧頂魚比即將進(jìn)棧的魚大則吃掉它 sign = 0; //這里的標(biāo)記改為1,表示該魚已經(jīng)被吃掉,不讓其進(jìn)棧 break; }s.pop(); //若即將進(jìn)棧的魚未被吃掉,說明棧頂魚被吃掉 if(s.empty()) break; //若棧頂魚被吃掉后,棧成空,則跳出循環(huán),循環(huán)的目的是要考慮即將進(jìn)棧的 魚可能與棧頂之前的魚也會(huì)發(fā)生沖突 a = s.top(); //執(zhí)行到此,說明之前的棧頂魚被吃掉了,而且棧不為空,所以將新的棧頂魚賦值給a }if(sign) s.push(f); //在上面的for循環(huán)中,若即將進(jìn)棧的魚被吃掉了,則sign變成了0,若sign還為1說明它未與剩下的魚發(fā)生沖突,或者,它把與它發(fā)生沖突的魚都吃掉了 }printf("%d\n",s.size()); //打印還剩多少魚 }return 0;
}
總結(jié)
以上是生活随笔為你收集整理的栈+模拟(大鱼吃小鱼)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。