P2058 海港 (洛谷)
生活随笔
收集整理的這篇文章主要介紹了
P2058 海港 (洛谷)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個題復制過來真的有點惡心,懶得手打,以后再搬題面吧。
今天我雙更了,AC這個題我就完成某谷春令營第一課的作業了(假的)
這個題是個雙指針。非常友善。一直往里讀入就可以了,遇見不是一條船的乘客輸出這一條船前86400秒有多少不同國籍的人,然后從末尾查看,時間差大于等于86400的人清除,切記以上兩步不要搞混。這個方法每個乘客只會入隊出隊一次,乘客最多只有300000人。是完全可行的。
接下來就是人見人愛的代碼了:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
long long bj[100005],n,k,t,w,e,zs,s,shu,zshu;
struct hehe
{
long long gj,sj;//gj是國籍,sj是到來的時間
}ck[300005];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
cin>>k;
for(int j=0;j<k;j++)
{
cin>>e;
zs++;//第zs個乘客
ck[zs].gj=e;//國籍
ck[zs].sj=s;//到達時間
}
}
t=1;//頭指針
w=1;//尾指針
while(t<=zs)//所有乘客都算過一遍后結束
{
if(ck[t].sj!=ck[t-1].sj&&t!=1)//出現了不同船的乘客,說明上一條船前86400秒乘客全部計算過了,現在是在上艘船到達時間之后。
{
cout<<shu<<endl;//一定要先輸出,不然萬一減掉不該減的乘客就會WA掉。
while(ck[t].sj-ck[w].sj>=86400)//是>=不是>
{
bj[ck[w].gj]--;
if(bj[ck[w].gj]==0)//如果這個國籍的乘客已經沒有了,這艘船前86400秒的總數--。
{
shu--;
}
w++;
}
}
if(bj[ck[t].gj]==0)//來了新乘客。
{
shu++;
}
bj[ck[t].gj]++;//這個乘客國籍的人數+1;
t++;//查看下一個。
}
cout<<shu<<endl;//最后一艘船的國籍數。
return 0;
}
之前這個題我還直接放棄過呢。現在看看也不難。
總結
以上是生活随笔為你收集整理的P2058 海港 (洛谷)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员父亲的遗产——编程十诫
- 下一篇: UML造型——使用EA时序图工具的开发实