CF97C Winning Strategy
这题好玄学鸭。。。都不知道为啥是对的
设(f[i][j])表示打了i轮比赛,有j个参加了一次的人,直接枚举有几个参加了转移过去即可
#include<bits/stdc++.h>
#define il inline
#define vd void
#define ll long long
il int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
double p[101];
double f[2][20001];
int main(){
int n=gi();double ans=0;
for(int i=0;i<=n;++i)scanf("%lf",&p[i]);
int now=0;
memset(f[now],-63,sizeof f[now]);
f[now][0]=0;
for(int i=0;i<=200;++i){
memset(f[now^1],-63,sizeof f[now^1]);
for(int j=0;j<=(i?20000:0);++j){
if(i)ans=std::max(ans,f[now][j]/i);
for(int k=0;k<=n;++k)
if(j+n-k-k>=0&&j+n-k-k<=20000){
f[now^1][j+n-k-k]=std::max(f[now^1][j+n-k-k],f[now][j]+p[k]);
}
}
now^=1;
}
printf("%.10lf
",ans);
return 0;
}