p1846 [2.5]宝藏分配

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84893588

题目

描述 Description
小x,小y和小z在焦作一中东南角的臭水沟里发现了一堆宝藏。
这堆宝藏是由n (1 <= n <= 20)包元宝组成,每包含si (1 <= si <= 100)个元宝,三个人很光明正大的决定把这些元宝私分。
当然,他们都希望把这批宝藏尽可能的平分,他们又约定不能把包给拆开。这样,平分的标准就是获得元宝个数最多的那个人的元宝个数尽可能的小,他们约定,谁先算出,谁可以先挑。
例如:现在有8包元宝,每包分别有元宝:2 4 5 8 9 14 15 20
最公平的分法是:
1: 2 9 15  一共获得 26
2: 4 8 14  一共获得26
3: 5 20   一共获得 25
那么26就是我们需要的
现在,眼红的你,能算出获得元宝最多的那个人最少能获得多少元宝么?
输入格式 Input Format
第一行一个整数n
接下来n行,每行一个整数,表明每包含有元宝的个数。
输出格式 Output Format
一个整数,如题目描述所求。
样例输入 Sample Input

8
14
2
5
15
8
9
20
4

样例输出 Sample Output

26
时间限制 Time Limitation
1s
注释 Hint
【数据范围】

30% n<=5
来源 Source
usaco2012 jan

题解

这并不是正解,而是乱搞,然而搞过了,%杨宇航大佬。

代码

#include<bits/stdc++.h>
using namespace std;
const int _=100;
inline int read()
{
	int f=1,num=0;
	char ch=getchar();
	while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
	while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0',ch=getchar();
	return num*f;
}
int n,d[_],sum[_],cnt,ans=1000000,minn;
bool cmp(int a,int b)
{
	return a>b;
}
void dfs(int cnt,int a,int b,int c)
{
	if (clock()>900)
	{
		printf("%d",ans);
		exit(0);
	}
	if (min(a,min(b,c))+sum[n]-sum[cnt-1]<minn) return ;
	if (cnt>n)
	{
		ans=min(ans,max(a,max(b,c)));
		minn=max(minn,min(a,min(b,c)));
		return;
	}
	dfs(cnt+1,a+d[cnt],b,c);
	dfs(cnt+1,a,b+d[cnt],c);
	dfs(cnt+1,a,b,c+d[cnt]);
}
int main()
{
	n=read();
	for (int i=1;i<=n;++i)
		d[i]=read();
	sort(d+1,d+n+1,cmp);
	for (int i=1;i<=n;++i)
		sum[i]=sum[i-1]+d[i];
	dfs(2,d[1],0,0);
	printf("%d",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84893588
2.5