第一行三個整數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表示地圖已全部被裝下。
測試點#guard1.in 結果:ac 記憶體使用量: 256kb 時間使用量: 0msprogram 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.
測試點#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 我尼瑪...