7-2 港口审查 (15 分)

一:题目

afeng是一个港口的海关工作人员,每天都有许多船只到达港口,船上通常有很多来自不同国家的乘客。

afeng对这些到达港口的船只非常感兴趣,他按照时间记录下了到达港口的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘客数ki,以及每名乘客的国籍 xi,1,xi,2,…,xi,k。

afeng统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足ti−86400<tp≤ti的船只p,在所有的xp,j中,总共有多少个不同的数。

输入格式:
第一行输入一个正整数n,表示小K统计了n艘船的信息。

接下来n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来ki个整数表示船上乘客的国籍。

保证输入的ti是递增的,单位是秒;表示从afeng第一次上班开始计时,这艘船在第ti秒到达海港。

保证 1≤n≤10^5,∑ki ≤ 3∗105,1≤xi,j≤105,1≤t(i-1)≤ti≤10^9

其中∑ki表示所有的ki的和。

输出格式:
输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。

输入样例1:
3
1 4 4 1 2 2
2 2 2 3
10 1 3
结尾无空行
输出样例1:
3
4
4
结尾无空行
输入样例2:
4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5
结尾无空行
输出样例2:
3
3
3
4
结尾无空行
样例1解释:

第一艘船在第1秒到达港口,最近24小时到达的船是第一艘船,共有4个乘客, 分别是来自国家4,1,2,2,共来自3个不同的国家;

第二艘船在第2秒到达港口,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家4,1,2,2,2,3,共来自4个不同的国家;

第三艘船在第10秒到达港口,最近24小时到达的船是第一艘船、第二艘船和第 三艘船,共有4+2+1=7个乘客,分别是来自国家4,1,2,2,2,3,3,共来自4个不同的国家。

样例2解释:

第一艘船在第1秒到达港口,最近24小时到达的船是第一艘船,共有4个乘客,分别是来自国家1,2,2,3,共来自3个不同的国家。

第二艘船在第3秒到达港口,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家1,2,2,3,2,3,共来自3个不同的国家。

第三艘船在第86401秒到达港口,最近24小时到达的船是第二艘船和第三艘船,共有2+2=4个乘客,分别是来自国家2,3,3,4,共来自3个不同的国家。

第四艘船在第86402秒到达港口,最近24小时到达的船是第二艘船、第三艘船和第四艘船,共有2+2+1=5个乘客,分别是来自国家2,3,3,4,5,共来自4个不同的国家。

二:上码(这个码有问题 测试点第二个超时 分享出来 希望可以指错 )

/**
  思路:1.题目写的挺复杂,所以我们就要精简题目,也就是只看输入和输出分析数据和
         末尾给出的解释。 
	   2.因为我们是要统计24小时以内的数据,所以我们需要判断每次的到达时间和前面的时间
	   	 的关系。如果与其做减法小于86400,那么说明在24小时以内,这时我们统计不同的国籍
		 个数,需要从前面的时间有多少个不同国籍数进行统计,那么这时我们就需要用到一对多
		 的容器map<int,vector<int> >; 在用set容器装下每个时间对应的国籍数(用set主要目的
		 是为了去重) 
	   	 
	   	3
		1 4 4 1 2 2
		2 2 2 3
		10 1 3
		
		4
		1 4 1 2 2 3
		3 2 2 3
		86401 2 3 4
		86402 1 5  	 
		
		
*/ 
#include<iostream>
#include<map>
#include<vector>
#include<set> 
using namespace std;

int main(){
	
	vector<int> v1;//统计24小时以内的不同的国籍个数 
	vector<int> v2;//记录时间 
	vector<int> v3;//处理每个时间所对应的国籍号码 
	map<int,vector<int> > m; //统计每个时间不同的国籍个数 
	map<int,vector<int> >:: iterator mt;
	int N;
	//cin >> N;
	scanf("%d",&N);
    
	for(int i = 0; i < N; i++) {
		
		int time,M;
		//cin >> time >> M;
        scanf("%d%d",&time,&M);
		v2.push_back(time);
		
		set<int> s_one;
		
		for(int j = 0; j < M; j++) {		
			int num;
			//cin >> num;
            scanf("%d",&num);
			v3.push_back(num);	
			s_one.insert(num);//这里主要是处理第一个时间对应的国籍个数		
		}
		
		m[time] = v3;
		v3.clear();
							           
		if(i != 0){
			for(int j = 0; j < v2.size()-1; j++){
				if(time - v2[j] < 86400){//说明在24小时以内  v2[j]往后的所有时间均是在24小时以内的 
					
					set<int> s; 	
					for(mt = m.begin(); mt != m.end(); mt++){
						if(mt->first >= v2[j]){//这里表示的是我们选择的是所有在24小时以内 
							
							vector<int>:: iterator vt;
							
							for(vt = mt->second.begin(); vt != mt->second.end(); vt++){//遍历每个时间对应的国籍号 
								s.insert(*vt);	
							//	cout << *vt << ' ';			
							}		
						}						
					} 	
					
				//	cout << endl;			
					v1.push_back(s.size());	
					
					break;//跳出这个循环,因为我们已经统计完了24小时以内的不同的国籍的个数				
				} 
					
			}		
		} else{
			v1.push_back(s_one.size());//记录首个时间的国籍个数 
		} 
		 			
	}
		
	for(int i = 0; i < v1.size(); i++) {
		//cout << v1[i] << endl;
        printf("%d\n",v1[i]);
	}
	
	


在这里插入图片描述

如果同学会做这道题可以私信我,关于超时的 我感觉八成我的思路可能会有问题,如果你有思路可以留言或则私信

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值