想到了数组,也想到了队列,就是没想到怎么配合使用,genius和本人的区别----
参考了b站视频,秒懂
1、此题不涉及船只,所以只需存储和人相关的信息
(1)队列用来存储结构体,结构体存储人到的时间(也就是船到的时间)+人的国籍
(2)一维数组存国籍和对应的人数
2、先进人再判时间
(1)输入国籍x,如果在ct数组中,x对应的值是0,说明这是新出现的,ans++。然后push到队列
(2)判时间(题中有给边界,≥86400就不满足),当前时间t和队头比较,满足即:国籍对应人数-1,减到0则ans--;同时出栈
3、注意队列的队头是front(),不是top()
PS:突然发现本人写代码总是出现写错行,然后就error了o(╥﹏╥)o
#include<bits/stdc++.h>
using namespace std;
//创建结构体存储人到达的时间及国籍
struct people{int t;int x;
};
//创建数组,存储国籍及对应的人数
int n,t,k,x,ct[100005]={0},ans=0;
int main(){
// 队列存储人的信息 queue<people> q;cin>>n;for(int i=0;i<n;i++){cin>>t>>k;for(int j=0;j<k;j++){cin>>x;
// 把该人放入队列里 q.push({t,x});
// 若下面两行互换位置,ans就出错了 if(ct[x]==0) ans++;ct[x]++;}
// 判断时间差距while(t-q.front().t>=86400){ct[q.front().x]--;
// 若下面两行互换位置,则会忽略掉一个元素 if(ct[q.front().x]==0) ans--;q.pop();} cout<<ans<<endl;}}