weixin_41724644 2018-07-28 14:21 采纳率: 100%
浏览 1039
已采纳

一道C++题,初入门萌新求大神解答并告一下思路

海港(port)
【问题描述】
小谢是海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。
小谢对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船只到达的时间ti(单位:秒),船上的乘客数量Ki,以及每名乘客的国籍x(i,1),x(i,2),···,x(i,k)。
小谢统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时
(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。
形式化的讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足:ti-86400 输入格式:第1行输入一个正整数n,表示小谢统计了n艘船的信息。
接下来的n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来的ki个整数x(i,j)表示从小谢第一次上班开始计时,这艘船在第ti秒到达海港。
保证1=1,∑ki<=3×105,1<=x(i,j)<=105,1<=ti-1<ti<=109。其中∑ki表示所有ki的和。输出格式
输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。
【输入样例1】
3
1 4 4 1 2 2
2 2 2 3
10 1 3
【输出样例1】
3
4
4
样例1说明:第一艘船在第一秒到达海港,最近24小时到达的船是第一艘船,共4个乘客,分别来自国家4,1,2,2,共来自3个不同的国家。
第2艘船在第2秒到达海港,最近24小时到达的船是第1艘船和第2艘船,共有4+2=6个乘客,分别来自国家4,1,2,2,2,3,共来自4个不同的国家;
第三艘船在第10秒到达海港,最近24小时到达的船是第1艘船、第2艘船和第3艘船,共有4+2+1=7个乘客,分别是来自国家4,1,2,2,2,3,3,共来自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
样例2说明:第一艘船在第一秒到达海港,最近24小时到达的船是第1艘,共有4个乘客,分别是来自国家1,2,2,3,共来自3个不同的国家。
第2艘船是第3秒到达海港,最近24小时到达的船是第一艘船和第2艘船,共有4+2=6个乘客,分别来自1,2,2,3,2,3,共来自3个不同的国家
第3艘船是第86401秒到达海港,最近24小时到达的船是第2艘船和第3艘船,共有2+2=4个乘客,分别来自2.3,3,4,共来自3个不同的国家
第4艘船是第86402秒到达海港,最近24小时到达的船是第2艘船、第3艘船和第4艘船,共有2+2+1=5个乘客,分别来自2,3,3,4,5,共来自4个不同的国家

  • 写回答

1条回答

  • devmiao 2018-07-28 15:28
    关注
     主要思路是利用结构体和队列 记录每个人的国籍和时间 
    再用sum记录下从开始的时候海港一共来过多少个不同国籍的 
    每次找的时候 用old=q.front 如果这个人在一天以前来的 
    就把他赶走 如果他们国家就他一个 那么答案数sun减一 
    最后输出sum就行了
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    using namespace std;
    int a[100100];
    int people[500100];
    struct node{
        int country;
        int time;
    };
    queue<node>q;
    int main(){
        int n,sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int t,p;
            scanf("%d%d",&t,&p);
            node temp;
            temp.time=t;
            for(int i=1;i<=p;i++){
                int cty;
                scanf("%d",&cty);
                temp.country=cty;
                q.push(temp);
                if(!people[cty]) sum++;
                people[cty]++;
            }
            while(1){
                node old;
                old=q.front();
                if(temp.time-86400>=old.time)
                {
                    int tc=old.country;
                    people[tc]--;
                    if(!people[tc]) sum--;
                    q.pop();
                }
                else break; 
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何实验stm32主通道和互补通道独立输出
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题