題目描述
小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...