NOIP2016普及組第三題 海港

2022-09-18 01:36:29 字數 3439 閱讀 6698

題目描述

小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:

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個不同的國家。

【資料範圍】

這題可以直接暴力,但是只對了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.

可以多用乙個陣列,表示到當前的24小時內,每種人的數量,這樣就可以減少沒必要的迴圈。

如果當這艘船已經過了24小時,則將這艘船上的每種人的數量減去。

最後就很容易判斷有多少種人。

**如下:

var  ans,n,head,tail,i,j,time,m,x:longint;

a:array[1..2,1..300000]of longint;

b:array[1..300000]of longint;

begin

readln(n);

head:=1; tail:=1;

for i:=1

to n do

begin

read(time,m);

for j:=tail to tail+m-1

dobegin

read(x);

a[1,j]:=time;

a[2,j]:=x;

inc(b[x]);

if b[x]-1=0

then inc(ans);

end;

readln;

while time-a[1,head]>=86400

dobegin

dec(b[a[2,head]]);

if b[a[2,head]]=0

then dec(ans);

inc(head);

end;

tail:=tail+m;

writeln(ans);

end;

end.

NOIP 2016 普及組 海港

題目鏈結 小k是乙個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。小k對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況 對於第i艘到達的船,他記錄了這艘船到達的時間ti 單位 秒 船上的乘客數ki,以及每名乘客的國籍 xi,1,xi,2,x...

noip2016普及組複賽總結

9點半從紀中出發,大概11點多來到廣州六中。在六中旁邊一家小餐館吃了中餐,那餐廳真心很貴,一盆飯就要20元,我們那桌吃了四 盆.xc 不想買單啦 啦啦啦 然後就來到六中的某個功能室百無聊賴的休息了一會兒,兩點鐘進考場。兩點半 比賽開始,還是先看題.一二兩題太水了,直接開碼,1小時搞定兩題 三點半 仔...

NOIP 2016 普及組 複賽題解

t1 pencil 隨便做 include using namespace std int n,a,b,ans 2147483647 int main t2 date 列舉每個 月 1 12 日 1 day i 再判斷此日期符不符合 把月日反過來就是年 注意二月二十九號推出的日期是 92200229...