第一行三個整數 n,k,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色
調的數目和能接受的最低消費的最高值;
接下來的 n 行,第i+1 行兩個整數,之間用乙個空格隔開,分別表示i 號客棧的裝飾色
調和i 號客棧的咖啡店的最低消費。
輸出只有一行,乙個整數,表示可選的住宿方案的總數。
5 2 3
0 51 3
0 21 4
1 5o(n*n)方法:記錄各個點的c[i],v[i],然後訪問每個點,每個點再跟後面的點比較,相同顏色的+1,比p大的+0。
o(n*k)方法:上面方法的優化
f[i,j]表示在前i個點中,有顏色j的客棧的數量。 當我們讀入c,v後,必須把0 到 k-1點中更新一下。
但是如果我們找到v比p來的大的話,怎麼辦?我們就要分類討論,第一種:把總數加上在該點前面相同顏色的個數,即
s:=s+f[i,c]-1(減1的原因是因為f[i,c]記錄了該點加上前面的點);第二種:s:=s+f[前面小於等於v的點,c];最後輸出s;
1view codevar f:array[0..200010,0..50] of
longint;
2 a:array[0..200000] of
longint;
3i,j,k,n,p,c,v,s:longint;45
begin
6 assign(input,'
hotel.in
'); reset(input);
7 assign(output,'
hotel1.out
'); rewrite(output);
8readln(n,k,p);
9for i:=1
to n do
10begin
11readln(c,v);
12for j:=0
to k-1
do13
if j=c then f[i,j]:=f[i-1,j]+1
else f[i,j]:=f[i-1
,j];
14if v<=p then
15begin
16 a[i]:=i;
17 s:=s+f[i,c]-1;18
endelse
19begin
20 a[i]:=a[i-1
];21 s:=s+f[a[i],c];
22end;23
end;
24writeln(s);
25close(input); close(output);
26end.
貌似可以再優化下
o(n)方法: 這種方法在時空複雜度,程式設計複雜度來說都比前面方法來的簡單。
我們可以開3個陣列:a,b,d。
讀入c,v,
a[c]前面以及該點的點中顏色為c的客棧數,b[c]前面以及該點的點中顏色為c且(符合消費或者相差距離不為1)的客棧數,d[c]為 上乙個顏色c的客棧編號, 如果到該點最近的符合消費的客棧不小於上乙個顏色c的客棧編號(d[c]),就b[c]:=a[c]。
最後記得把總數加上b[c],a[c]+1,更新d[c]:=i; 輸出s;
1view codevar a,b,d:array[0..60] of
longint;
2n,k,p,i,c,v,f,s:longint;34
begin
5 assign(input,'
hotel.in
'); reset(input);
6 assign(output,'
hotel.out
'); rewrite(output);
7readln(n,k,p);
8for i:=1
to n do
9begin
10readln(c,v);
11if v<=p then f:=i;
12if f>=d[c] then b[c]:=a[c];
13 s:=s+b[c];
14inc(a[c]);
15 d[c]:=i;
16end;17
writeln(s);
18close(input); close(output);
19end.
還有一種o(nlogn)的方法:用list[i,j]表示顏色為i的第j個客棧,也就是將客棧按照顏色緊縮儲存。另用pos[i]表示第i個旅館在list [color[i]]中的位置。用線段樹/st演算法(推薦)預處理出區間消費的最小值,也就是min,易得到 min[k,i]是非增的,注意這是後面二分的關鍵。然後列舉第二個人,在list[color[i]]中用二分找到乙個j滿足 min[j,i]<=p,那麼ans=ans+j,因為list[color[i],1..j]中必然都是顏色為color[i],且區間最小值也都<=p。
NOIP 2011 選擇客棧
奇奇怪怪的題目。奇奇怪怪的演算法。題目描述 description輸入描述 input description 共n 1 行。第一行三個整數 n,k,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值 接下來的 n 行,第i 1 行兩個整數,之間用乙個空格隔開...
NOIP2011選擇客棧
題目分析 這是一道比較好玩的題目,情景感比較強。而問題的實質就是 1 將同種顏色的客棧進行處理。2 對於乙個客棧,它有兩種情況,費用超過p 費用不超過p。3 超過p的找之後相同顏色且費用不超過p的。4 不超過p的與之後相同顏色的隨意組合。既然是批量處理,自然想到了字首和。處理3的時候用到了字尾和 想...
Noip2011 選擇客棧
麗江河邊有 n 家很有特色的客棧,客棧按照其位置順序從 1 到 n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的...