NOIP2011 選擇客棧

2022-06-03 09:42:10 字數 2574 閱讀 6162

第一行三個整數 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;

1

var 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.

view code

貌似可以再優化下

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;

1

var 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.

view code

還有一種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 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的...