求助
查看原帖
求助
303782
Thir楼主2020/5/21 10:49
#include <iostream>
#include <cstdio>
#include <queue> //队列的STL的头文件
using namespace std;
int a[100005],sum,n,m,tmp;
struct node //存储时间与国籍的结构体
{
    int t;
    int g;
};
node b,f; //队列头与队列尾
queue <node> q; //声明类型为node结构体的队列
int main ()
{
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
    {
        scanf("%d%d",&tmp,&m);
        for (int j=1; j<=m; j++)
        {
            node* nd=new node(); //声明新空间
            nd->t=tmp; //存入时间
            scanf("%d",&nd->g);
            a[nd->g]++; //存入同样国籍出现次数
            if (a[nd->g]==1) sum++; //如果此类国籍等于1,那么总国籍数目++
            q.push(*nd); //将临时结构体压入队列中
        }
        b=q.back(); //求队列尾
        f=q.front(); //求队列头
        while (b.t-f.t>=86400) //判断队列尾减去队列头是否有86400分钟
        {
            a[f.g]--; //减去同样国籍出现次数
            if (a[f.g]==0) sum--; //如果此类国籍等于0,那么总国籍数目--
            q.pop(); //弹出队列头
            f=q.front(); //更新队列头
        }
        printf("%d\n",sum);
    }
    return 0;
}

这是大佬的答案,我不明白的是他作为结构体里面的国家是一组数还是一个数呢,scanf("%d",&nd->g)不会覆盖之前的数的吗?如果会,那么之后的判断不是只会删掉最后一个读入的国籍吗?这是蒟蒻的想法,求大佬解疑。

2020/5/21 10:49
加载中...