日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈+模拟(大鱼吃小鱼)

發(fā)布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈+模拟(大鱼吃小鱼) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

#大魚吃小魚
有N條魚每條魚的位置及大小均不同,他們沿著X軸游動,有的向左,有的向右。游動的速度是一樣的,兩條魚相遇大魚會吃掉小魚。從左到右給出每條魚的大小和游動的方向(0表示向左,1表示向右)。問足夠長的時間之后,能剩下多少條魚?
##Input
第1行:1個數(shù)N,表示魚的數(shù)量(1 <= N <= 100000)。
第2 - N + 1行:每行兩個數(shù)A[i], B[i],中間用空格分隔,分別表示魚的大小及游動的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
##Output
輸出1個數(shù),表示最終剩下的魚的數(shù)量。
##Input示例
5
4 0
3 1
2 0
1 0
5 0
##Output示例
2

####問題分析:
此題在分析后采用棧這種存儲結(jié)構(gòu)較為簡單,但需要注意的是只有當(dāng)棧頂魚向右而將要進棧的魚向左時才會發(fā)生大魚吃小魚的情況,其他的都只需要將將要進棧的魚壓入棧頂即可,因為不會發(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)了即將進棧的魚與棧頂魚發(fā)生沖突(大魚吃小魚) if(a.fi>f.fi){ //如果棧頂魚比即將進棧的魚大則吃掉它 sign = 0; //這里的標(biāo)記改為1,表示該魚已經(jīng)被吃掉,不讓其進棧 break; }s.pop(); //若即將進棧的魚未被吃掉,說明棧頂魚被吃掉 if(s.empty()) break; //若棧頂魚被吃掉后,棧成空,則跳出循環(huán),循環(huán)的目的是要考慮即將進棧的 魚可能與棧頂之前的魚也會發(fā)生沖突 a = s.top(); //執(zhí)行到此,說明之前的棧頂魚被吃掉了,而且棧不為空,所以將新的棧頂魚賦值給a }if(sign) s.push(f); //在上面的for循環(huán)中,若即將進棧的魚被吃掉了,則sign變成了0,若sign還為1說明它未與剩下的魚發(fā)生沖突,或者,它把與它發(fā)生沖突的魚都吃掉了 }printf("%d\n",s.size()); //打印還剩多少魚 }return 0; }

總結(jié)

以上是生活随笔為你收集整理的栈+模拟(大鱼吃小鱼)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。