社区讨论

暴力拍死正解。。

P2473[SCOI2008] 奖励关参与者 9已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi7cl7f3
此快照首次捕获于
2025/11/20 19:28
4 个月前
此快照最后确认于
2025/11/20 19:28
4 个月前
查看原帖
考试的时候写了暴力和正解然后暴力把正解拍掉了。。
暴力思路 枚举每次掉的宝物,枚举每次选不选 正解思路 倒着DP
hack: 3 5 -5 0 3 1 0 -1 4 5 0 3 0 -5 2 5 0
暴力:1.800800 正解:1.800000
CPP
暴力。。
#include<iostream>
#include<cmath>
#include<cstdio>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define INF 1e100
#define inv(x) (1<<((x)-1))
using namespace std;
int cnt,n,val[20],x,S[20];
int treature[110];
double ans;
double temp=1;
int find(int now,int status)
{
	if(now<=cnt)
	{
		int A=0,B=0;
		if ((status&S[treature[now]])==S[treature[now]]) A=val[treature[now]]+find(now+1,status|inv(treature[now]));
		B=find(now+1,status);
		return max(A,B);
	}	
	else
	{
		return 0;
	}
}
int dfs(int now)
{
	if (now<=cnt)
	{
		For(i,1,n)
		{
			treature[now]=i;
			dfs(now+1);
		}
	}
	else
	{
		ans+=find(1,0)*temp;
	}
}
int main()
{
//	freopen("reward.in","r",stdin);
//	freopen("reward.ans","w",stdout);
	scanf("%d%d",&cnt,&n);
	For(i,1,cnt) temp/=n;
	For(i,1,n)
	{
		scanf("%d",&val[i]);
		scanf("%d",&x);
		while (x!=0) 
		{
			S[i]|=1<<(x-1);
			scanf("%d",&x);
		}
	}
	dfs(1);
	printf("%.6lf\n",ans);
	fclose(stdin);fclose(stdout);
	return 0;
}



------------------------

正解??。。
#include<iostream>
#include<cstring>
#include<cstdio>
#define Ford(i,a,b) for(int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i<=b;i++)
#define INF 1e100
#define inv(x) (1<<((x)-1))
using namespace std;
int cnt,n,val[20],x,S[20];
double dp[110][1<<16],res[110][1<<16];
int main()
{
//	freopen("reard.in","r",stdin);
//	freopen("reard.out","w",stdout);
	scanf("%d%d",&cnt,&n);
	For(i,1,n)
	{
		scanf("%d",&val[i]);
		scanf("%d",&x);
		while (x!=0) 
		{
			S[i]|=1<<(x-1);
			scanf("%d",&x);
		}
	}
	Ford(i,cnt,1) 
	{
		For(j,1,n) 
		{
			For(k,0,(1<<n)-1)
			{
				res[i][k]=dp[i+1][k];
				if ((k&S[j])==S[j])
				{
					res[i][k]=max(res[i][k],dp[i+1][k|inv(j)]+val[j]);
				}
			}
			For(k,0,(1<<n)-1) dp[i][k]+=res[i][k]/n;
		}
	}
	printf("%.6lf\n",dp[1][0]);
	fclose(stdin);fclose(stdout);
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...