【NOIP2016普及组】复赛——海港

题目自己,复制会︿( ̄︶ ̄)︿


呵呵,这道题之那啥,反正可以做,但你得选择,爆空间还是爆时间

……那还叫可以做……


好的,说说这道题的思路,爆搜队列嘛:

用一个结构体队列存每个人来的时间和他的国籍,用一个vis数组存每个人来的次数,是第一次来sum便加一。

然后从前面第一个人开始扔(原谅我用这个词,因为我找不到更好的词了)下船,直到第一个人与当前这艘船相差没超过1天即可,每扔一个人便vis[此人国籍]减一,当这个人来的次数为0时,sum减一。

就这样,既不爆时间也不爆空间,完美!


你们期待的代码:

#include<cstdio>
#include<queue>
using namespace std;
struct p
{
    int pt,pn;//存每个人的时间和国籍
};
queue <p> ship;
int n,vis[100005],sum;
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        int t,m,_n;
        scanf("%d%d",&t,&m);//船来的时间和人数
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&_n);
            p x;
            x.pt=t;
            x.pn=_n;
            ship.push(x);//将这个人存入队列(就是那艘邪恶的不能久待就把你扔下去的船)
            vis[_n]++;
            if(vis[_n]==1)//如果是第一次来
                sum++;
        }
        while(1)
        {
            int a,b;
            a=ship.front().pt,b=ship.front().pn;//检查这个人
            if(t-a<86400)//与当前间隔没超过一天
                break;
            vis[b]--;
            if(vis[b]==0)
                sum--;
            ship.pop();//把这个人扔出去
        }
        printf("%d\n",sum);//输出sum
    }
}

                                                                                                                                                                           By WZY

posted @ 2016-12-22 13:43  ∑∞  阅读(325)  评论(0编辑  收藏  举报