Codevs P1997 守衛者的挑戰

2021-07-06 02:20:46 字數 3135 閱讀 5701

第一行三個整數n,l,k。

第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。

第三行n個整數,第i個整數ai表示第i項挑戰的屬性值。

乙個整數,表示所求概率,強制四捨五入保留6位小數。

【樣例輸入1】

3 1 0

10 20 30

-1 -1 2

【樣例輸入2】

5 1 2

36 44 13 83 63

-1 2 -1 2 1

【樣例輸出1】

0.300000

【樣例輸出2】

0.980387

在第乙個樣例中,若第三項挑戰成功,如果前兩場中某場勝利,隊員們就有空間來容納得到的地圖殘片,如果挑戰失敗,根本就沒有獲得地圖殘片,不用考慮是否能裝下;若第三項挑戰失敗,如果前兩場有勝利,沒有包來裝地圖殘片,如果前兩場都失敗,不滿足至少挑戰成功l次(l = 1)的要求。因此所求概率就是第三場挑戰獲勝的概率。

對於 100% 的資料,保證0≤k≤2000,0≤n≤200,-1≤ai≤1000,0≤l≤n,0≤pi≤100。

先將獎賞按從大到小排列,這樣搜到時如果揹包體積》0則是可行的<0則不可行。因為已經按照從大到小排序,獲得的揹包早就獲得完畢,再出現負值肯定不能再有包裝進去。

設f[i,j,k]表示前i場中贏j場容量為k的概率

那麼f[i+1,j,k]:=f[i+1,j,k]f[i,j,k]*(1-p[i+1]) 累加上第i+1場未獲勝的概率

如果第i+1場獲勝那麼得到num[i+1]的揹包或地圖,所以i+1場勝利時容量為k+num[i+1],當小於0時無意義,表示揹包不夠。

所以如果k+num[i+1]>0和n取較小值,大於n沒有用處。

所以當第i+1場勝利時

now:=k+num[i+1]

now:=min(now,n);

f[i+1,j+1,now]:=f[i+1,j+1,now]+f[i,j,k]*p[i+1];

最終答案就是打完n場後勝利l場以上的揹包容量》=0的概率和。>=0表示地圖已全部被裝下。

program p1997;

var now,n,l,k,i,j,s,e:longint;

p:array[1..1000] of double;

num:array[1..1000] of integer;

f:array[0..200,0..200,0..200] of double;

ans:double;

function

min(a,b:longint):longint;

begin

if athen

exit(a);

exit(b);

end;

procedure

qsort

(l,r:longint);

var i,j,mid:longint;

temp1:longint;

temp2:double;

begin

i:=l;

j:=r;

mid:=num[(i+j)>>1];

while i<=j do

begin

while num[i]>mid do inc(i);

while num[j]do dec(j);

if i<=j

then

begin

temp1:=num[i];

temp2:=p[i];

num[i]:=num[j];

p[i]:=p[j];

num[j]:=temp1;

p[j]:=temp2;

inc(i);

dec(j);

end;

end;

if ithen qsort(i,r);

if lthen qsort(l,j);

end;

begin

readln(n,l,k);

for i:=1

to n do

begin

read(p[i]);

p[i]:=p[i]/100;

end;

for i:=1

to n do

read(num[i]);

qsort(1,n);

f[0,0,min(k,n)]:=1;

for i:=0

to n-1

dofor j:=0

to i do

for s:=0

to n do

begin

f[i+1,j,s]:=f[i+1,j,s]+f[i,j,s]*(1-p[i+1]);

now:=s+num[i+1];

if now<0

then continue;

now:=min(now,n);

f[i+1,j+1,now]:=f[i+1,j+1,now]+f[i,j,s]*(p[i+1]);

end;

for i:=0

to n do

for j:=l to n do

ans:=ans+f[n,j,i];

write(ans:0:6);

end.

測試點#guard1.in 結果:ac 記憶體使用量: 256kb 時間使用量: 0ms

測試點#guard10.in 結果:ac 記憶體使用量: 32880kb 時間使用量: 102ms

測試點#guard2.in 結果:ac 記憶體使用量: 368kb 時間使用量: 0ms

測試點#guard3.in 結果:ac 記憶體使用量: 256kb 時間使用量: 0ms

測試點#guard4.in 結果:ac 記憶體使用量: 1136kb 時間使用量: 0ms

測試點#guard5.in 結果:ac 記憶體使用量: 1264kb 時間使用量: 1ms

測試點#guard6.in 結果:ac 記憶體使用量: 2412kb 時間使用量: 4ms

測試點#guard7.in 結果:ac 記憶體使用量: 8556kb 時間使用量: 17ms

測試點#guard8.in 結果:ac 記憶體使用量: 8556kb 時間使用量: 18ms

測試點#guard9.in 結果:ac 記憶體使用量: 18800kb 時間使用量: 48ms

1997 守衛者的挑戰

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解輸入描述 input description 第一行三個整數n,l,k。第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。第三行n個整數,第i個整數ai表示第i項挑戰的屬性值。輸出描述 output desc...

1997 守衛者的挑戰

1997守衛者的挑戰 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解題目描述description 輸入描述input description 第一行三個整數n,l,k。第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。第三行n個整數,第i個整數ai表示...

codevs 1997 守衛者的挑戰

表示很遺憾.開始狀態想的沒錯 就是轉移的時候出了問題 自己也想到了陣列平移 然而沒往下寫 與正解擦肩而過 然後為了好轉移寫了個4維的 時間不多了沒來得及降維 草草的算算空間就交了 尼瑪double忘記 8了 華麗的直接memory limit exceeded while compiling 我尼瑪...