1997守衛者的挑戰
時間限制: 1 s
空間限制: 128000 kb
題目等級 : 鑽石 diamond
題解題目描述description
輸入描述input description
第一行三個整數n,l,k。
第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。
第三行n個整數,第i個整數ai表示第i項挑戰的屬性值。
輸出描述output description
乙個整數,表示所求概率,強制四捨五入保留6位小數。
樣例輸入sample input
【樣例輸入1】
3 1 0
10 20 30
-1 -1 2
【樣例輸入2】
5 1 2
36 44 13 83 63
-1 2 -1 2 1
樣例輸出sample output
【樣例輸出1】
0.300000
【樣例輸出2】
0.980387
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 211;
int n,l,k;
long double p[maxn],ans;
int a[maxn];
long double f[maxn][maxn][maxn*2];//滾動陣列
//long double f[maxn][maxn][maxn*2];//f[i][j][k]表示前i場挑戰,贏了j場並且容量為k的概率
//容量大於n的部分沒有任何作用
//容量為2×n表示實際的n的空間,容量為n表示實際的0,容量為0表示實際的還需要-n的空間
inline int getint()
int w=0,q=0; char c=getchar();
while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
inline void work(){
n=getint(); l=getint(); k=getint();
for(int i=1;i<=n;i++) scanf("%lf",&p[i]),p[i]/=100.0; for(int i=1;i<=n;i++) a[i]=getint();
f[0][0][n+min(n,k)]=1.0; int tag=1;
for(int i=1;i<=n;i++) {
memset(f[tag],0,sizeof(f[tag])); tag^=1;
for(int j=0;jfor(int k=n*2;k>=0;k--) {
f[tag^1][j+1][min(k+a[i],n*2)]+=f[tag][j][k]*p[i];
f[tag^1][j][k]+=f[tag][j][k]*(1-p[i]);
tag^=1; for(int i=l;i<=n;i++) for(int j=n;j<=n*2;j++) ans+=f[tag][i][j];
printf("%.6lf",ans);
int main()
work();
return 0;
1997 守衛者的挑戰
時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解輸入描述 input description 第一行三個整數n,l,k。第二行n個實數,第i個實數pi表示第i項挑戰成功的百分比。第三行n個整數,第i個整數ai表示第i項挑戰的屬性值。輸出描述 output desc...
Codevs P1997 守衛者的挑戰
第一行三個整數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 ...
codevs 1997 守衛者的挑戰
表示很遺憾.開始狀態想的沒錯 就是轉移的時候出了問題 自己也想到了陣列平移 然而沒往下寫 與正解擦肩而過 然後為了好轉移寫了個4維的 時間不多了沒來得及降維 草草的算算空間就交了 尼瑪double忘記 8了 華麗的直接memory limit exceeded while compiling 我尼瑪...