zoukankan      html  css  js  c++  java
  • NOIP2016普及组第三题——海港

    题目描述

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

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

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

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

    输入输出格式

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

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

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

    保证 , ,, 。

    其中表示所有的ki的和。

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

    输入输出样例

    输入样例#1: 

    1 4 4 1 2 2 
    2 2 2 3 
    10 1 3 
    输出样例#1: 



    输入样例#2: 

    1 4 1 2 2 3 
    3 2 2 3 
    86401 2 3 4 
    86402 1 5 
    输出样例#2: 




    说明

    【样例解释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个不同的国家。

    【数据范围】 


    这题可以直接暴力,但是只对了7个点,三个超时。

    边读边运行。读入time[i] (船到达的时间)和人数(每个人来自的国家),然后,用while取24小时内船数的最大值(x),再将x条船里的来自不同国家的人数统计出来。就拿到7个点——70分。


    代码如下:

    const max=86400;
    
    var   n,i,ans,t,l,j,k:longint;
          time:array[-1..1000]of int64;
          m:array[0..1000]of longint;
          a:array[1..1000,1..1000]of longint;
          f:array[1..1000]of boolean;
    begin
      assign(input,'port.in');
      assign(output,'port.out');
      reset(input);
      rewrite(output);
      readln(n);
      for i:=1 to n do
        begin
          fillchar(f,sizeof(f),false);
          ans:=0;
          read(time[i],m[i]);
          for j:=1 to m[i] do read(a[i,j]);
          t:=time[i];
          l:=i;
          while (abs(t-time[l-1])+1<=max)and(l>0) do dec(l);
          for j:=l to i do
            for k:=1 to m[j] do if f[a[j,k]]=false then begin inc(ans); f[a[j,k]]:=true; end;
          writeln(ans);
        end;
      close(input);
      close(output);
    

    end. 想看更多的请到:http://blog.csdn.net/ssl_zzy?viewmode=contents

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500235.html
Copyright © 2011-2022 走看看