noip2016普及組--海港
題目:
這道題主要的思路是用一個結構體佇列存每個人來的時間和他的國籍,用一個數組存每個國籍的人來的次數,是第一次來總數sum便加一。如果這個佇列的第一個人到達的時間超過了一天,就把這個人刪除,同時陣列[這個人的國籍]減一,當這個國籍的人數為0時,sum減一,每檢查一個人就刪除一個人,直到佇列的首位時間不超過一天,迴圈結束。
程式碼如下
#include <iostream> #include <cstdio> #include <queue>
using namespace std; struct passengers { int pt,px;//存入每個乘客的時間和國籍 }; queue <passengers> ship;//存入每個人的到來時間和國籍 int ans[100005];//存入每個國籍的人數 int main() { int n; cin>>n; int sum=0; while(n--) { int t,k,x; scanf("%d%d",&t,&k);//船來的時間和人數 for(int i=0;i<k;i++) { scanf("%d",&x);//k個人每個人的國籍 passengers m; m.pt=t; m.px=x; ship.push(m);//把每個人存入佇列 ans[x]++; if(ans[x]==1)//如果是第一次來 sum++; } while(1) { int a,b; a=ship.front().pt;//佇列第一個人的時間和國籍 b=ship.front().px; if(t-a<86400)//沒超過第一天 break; ans[b]--;//這個人對應減一 if(ans[b]==0) sum--; ship.pop();//刪除這個人 } printf("%d\n",sum); }
return 0; } 借鑑於 csdn 青天璇