codeforces 1256E Yet Another Division Into Teams

传送门

题意:

n个数字,分成若干队伍(每个队伍至少3个数字),每个队伍都有最大最小值的差值,如何才能使所有队伍的最大最小差值之和最小。

题解:

容易有结论:人数 \geq6,一定没有,人数<6优

下证:不妨设 \max(P[i])=A\quad\min(p[i])=B

           则任取 C,D(\not =A,B)\in P[i]\quad(C>D)

           有 A-C+B-D<A-B

所以我们可以通过将所有队员划分为3、4、5人数的队伍,贪心得按照大小顺序选择队员一定优,然后通过dp划分即可得到最优解

至于举例即可从后往前倒退dp最优解得出,原因是,最优解确定即可从后往前判断是否从当前得到的最优解,即能推出最优划分情况

代码:

#include"algorithm"
#include"iostream"
#include"stdlib.h"
#include"string.h"
#include"stdio.h"
#define ll long long
using namespace std;
const int Maxn=200005;
struct node
{
	ll sk,num;
}p[Maxn];
ll f1[Maxn];
int f2[Maxn],ans[Maxn];
inline bool cmp1(node a,node b)
{
	return a.sk=3&&f1[i-j-1]+p[i].sk-p[i-j].sk=0;k--)
				ans[p[i-k].num]=cnt;
			i=i-j;
			break;
		}
	}
	printf("%lld %d\n",f1[n],f2[n]);
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	return 0;
}

 

你可能感兴趣的:(dp,codeforces,贪心)