P2058 [NOIP 2016 普及组] 海港

想到了数组,也想到了队列,就是没想到怎么配合使用,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;
	}
	
}


posted @ 2025-03-28 19:32  夕瑶^  阅读(64)  评论(0)    收藏  举报