【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;
}
posted @ 2019-01-19 11:53  jz929  阅读(83)  评论(0编辑  收藏  举报