【NOIP2012模拟8.10】贿赂
这题让我懂得了什么叫做暴力出正解。。。
正解两个爆搜。
(想死了,以为时超便把第二个爆搜改成了DP,结果没调对)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
using namespace std;
int n,K,A,a[21],b[21],g[21][21];
db ans=0,s=0,f[21][21];
inline int read()
{
int x=0; char c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
void dg(int x,int ae,db ss,int q)
{
if (x>n)
{
if (ae>n/2) s+=ss;
else s+=ss*A/(A+q);
return;
}
dg(x+1,ae,ss*(1-b[x]/100.0),q+a[x]);
dg(x+1,ae+1,ss*b[x]/100.0,q);
}
void dfs(int x,int had)
{
if (x==n)
{
had=min(had,10-b[x]/10);
b[x]+=had*10;
s=0;dg(1,0,1,0);
ans=max(ans,s);
b[x]-=had*10;
return;
}
else
{
int mi=min(10-b[x]/10,had);
for (int i=0;i<=mi;i++)
b[x]+=i*10,dfs(x+1,had-i),b[x]-=i*10;
}
}
int main()
{
freopen("hl.in","r",stdin);
// freopen("hl.out","w",stdout);
n=read(),K=read(),A=read();
for (int i=1;i<=n;i++)
a[i]=read(),b[i]=read();
dfs(1,K);
printf("%.6lf\n",ans);
return 0;
}
转载需注明出处。