栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

7-2 港口审查 (15 分)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7-2 港口审查 (15 分)

一:题目

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

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

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

形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足ti−86400

输入格式:
第一行输入一个正整数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个不同的国家。

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

int main(){
	
	vector v1;//统计24小时以内的不同的国籍个数 
	vector v2;//记录时间 
	vector v3;//处理每个时间所对应的国籍号码 
	map > m; //统计每个时间不同的国籍个数 
	map >:: 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 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 s; 	
					for(mt = m.begin(); mt != m.end(); mt++){
						if(mt->first >= v2[j]){//这里表示的是我们选择的是所有在24小时以内 
							
							vector:: 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("%dn",v1[i]);
	}
	
	


如果同学会做这道题可以私信我,关于超时的 我感觉八成我的思路可能会有问题,如果你有思路可以留言或则私信
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号