zoukankan      html  css  js  c++  java
  • 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;
    }

     之前这个题我还直接放弃过呢。现在看看也不难。

  • 相关阅读:
    September 29th 2017 Week 39th Friday
    September 28th 2017 Week 39th Thursday
    September 27th 2017 Week 39th Wednesday
    September 26th 2017 Week 39th Tuesday
    September 25th 2017 Week 39th Monday
    September 24th 2017 Week 39th Sunday
    angular2 学习笔记 ( Form 表单 )
    angular2 学习笔记 ( Component 组件)
    angular2 学习笔记 ( Http 请求)
    angular2 学习笔记 ( Router 路由 )
  • 原文地址:https://www.cnblogs.com/lichangjian/p/12455749.html
Copyright © 2011-2022 走看看