bnu 51640 Training Plan(类似区间dp)(北师16校赛)

小Q同学为了准备今年的ICPC Regional,计划在天之内刷掉道题,每道题有一个难度值,其中第道题的难度值为

然而处于半颓废状态中的小Q同学不希望在同一天中做难度差距悬殊的题目,定义第天中刷的题的难度的最大值减最小值为(如果第天没有刷题,则),那么整个计划的难度为

小Q同学可以按照任意的顺序刷题,并且一天中可以刷任意多道题,但是每道题只需要做一次,现在小Q同学想知道完成这个计划的总难度的最小值是多少。

Input

第一行是一个正整数,表示测试数据的组数,

对于每组测试数据,

第一行是两个整数,表示题数和天数,

第二行是个整数,表示每道题的难度值。

Output

对于每组测试数据,输出一个整数,表示整个计划的最小难度。

Sample Input

2
3 3
1 2 3
3 2
1 2 3

Sample Output

0
1

Hint

对于第一组样例,最优方案是一天刷一题。

对于第二组样例,一个最优方案是第一天刷难度值为1和2的题,第二天刷难度值为3的题。

题目大意:

n天刷m道题,m道题可以随意分配,每天的难度值是当天题目的最大最小难度之差的平方,求所有天加一起的难度最小值

解题思路:

将这些题的难度从小到大排好序(从大到小也可以),可以断定每天做的题一定是这里连续的区间,因为假设跳了n个,那么交换这个和当前区间的难度最大的那几个题,和下一天交换,答案一定更小。

之后用dp[i][j]表示第i天刷到第j题的最小值,那么dp[i][j]=min(dp[i-1][k]+(a[j]-a[k])^2)(k=1...j-1),dp[n][m]即为所求。

注意:INF要开的足够大,否则会wa

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#define C(a) memset(a,0,sizeof a)
#define C_1(a) memset(a,-1,sizeof a)
#define C_I(a) memset(a,0x3f,sizeof a)
using namespace std;
typedef long long ll;
const ll INF = 1000000000000000000ll;
const int maxn = 1e6 + 20;
int t[maxn];
ll a[maxn];
int ca;
ll dp[520][520];
int n, m;
int main()
{
	int T; cin >> T;
	while (T--)
	{
		C(t);
		C(dp);
		C(a);
		ca = 0;
		scanf("%d%d", &n, &m);
		int x;
		for (int i = 0; i<n; i++)
		{
			scanf("%d", &x);
			if (t[x] == 0)a[ca++] = x;
			t[x]++;
		}
		sort(a, a + ca);
		if (ca <= m) { printf("0\n"); continue; }
		for (int j = 0; j<ca; j++)dp[1][j] = (a[j] - a[0])*(a[j] - a[0]);
		for (int i = 2; i <= m; i++)
		{
			dp[i][0] = 0;
			for (int j = 1; j<ca; j++)
			{
				dp[i][j] = INF;
				for (int k = 0; k<j; k++)
					dp[i][j] = min(dp[i][j], dp[i - 1][k] + (a[j] - a[k + 1])*(a[j] - a[k + 1]));
			}
		}
		cout << dp[m][ca - 1] << endl;
	}
	return 0;
}
时间: 2024-11-05 06:27:09

bnu 51640 Training Plan(类似区间dp)(北师16校赛)的相关文章

bnu 51644 Whalyzh&#39;s Problem(网络流,最大密度图) (北师16校赛)

很久以前,当whalyzh同学是一个萌新的时候,遇到了这么一个问题: 给定长为的序列,构造一个只有0和1的长为的序列,使得的值最大. 小Q同学想了一秒钟之后说:这不是一眼题么?然后whalyzh同学瞬间就会了. 过了几天,当whalyzh同学还是一个萌新的时候,遇到了这么一个问题: 给定阶方阵,构造一个只有0和1的的向量,使得的值最大. 小Q同学想了一分钟之后说:这不是一眼题么?然后whalyzh同学瞬间就会了. 又过了几天,当whalyzh仍然是一个萌新的时候,遇到了这么一个问题: 给定阶方阵

bnu 51636 Squared Permutation(树状数组)(北师16校赛)

最近,无聊的过河船同学在玩一种奇怪的名为"小Q的恶作剧"的纸牌游戏. 现在过河船同学手有张牌,分别写着,打乱顺序之后排成一行,位置从左往右按照标号. 接下来小Q同学会给出个操作,分为以下两种: 1.给定,交换从左往右数的第和第张牌, 2.给定,对从左往右数的第张牌,记下位置是这张牌上的数字的牌的数字,询问所有记下的数字加起来的结果. 虽然无聊的过河船同学精通四则运算,但是要完成这么大的计算量还是太辛苦了,希望你能帮他处理这些操作. Input 第一行是一个正整数,表示测试数据的组数,

bnu 51638 Air Hockey(三分+二分)(北师16校赛)

无聊的过河船同学和无聊的胀鱼同学非常喜欢打桌上冰球(其实只是喜欢听球碰撞时的声音).在无聊的一天,无聊的过河船同学想到了一个无聊的玩法:两人同时将两个球放桌面上,同时击出,然后听两颗球撞在一起时的声音.然而他们都对击球的精确度把握得不是很好,所以这两颗球并不一定能相撞. 现在假设桌面无限大,并且绝对光滑,给出两球的初始位置.半径和运动速度,保证两球初始没有接触.无聊的过河船同学想知道两球能否相撞(接触即认为相撞),如果能,他想知道两球相撞的时间(从两人击球时开始计时),如果不能,他想知道全过程中

bnu 51641 Certain Maze(bfs)(北师16校赛)

最近,无聊的过河船同学发现了一种无聊的迷宫生成算法. 算法过程如下: 一个的矩形区域可以看作个单位网格组成.在每个网格中,随机生成一个从右上角到左下角的L型障碍或者从左上角到右下角的R型障碍(障碍可以被看作一条线段). 图1:两种障碍 这样便可以生成一个大小为的迷宫,如图2所示. 图2:无聊的迷宫 然后过河船同学想知道,是否存在迷宫内的从迷宫上边界到达迷宫的下边界的路径.于是无聊的过河船同学花了一夜的时间,终于找到一条路径. 图3:过河船同学辛辛苦苦找到的道路 痛苦的过河船同学不想再伤害自己的眼

BNU 51640 Training Plan DP

Training Plan 小Q同学为了准备今年的ICPC Regional,计划在天之内刷掉道题,每道题有一个难度值,其中第道题的难度值为. 然而处于半颓废状态中的小Q同学不希望在同一天中做难度差距悬殊的题目,定义第天中刷的题的难度的最大值减最小值为(如果第天没有刷题,则),那么整个计划的难度为. 小Q同学可以按照任意的顺序刷题,并且一天中可以刷任意多道题,但是每道题只需要做一次,现在小Q同学想知道完成这个计划的总难度的最小值是多少. Input 第一行是一个正整数,表示测试数据的组数, 对于

四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)

时间限制1秒 内存限制64M 题目描述: 「我们大部分的烦恼,是来自于梦想另一种有可能的人生.把希望寄托于自己的可能性这种不能指望的东西,正是万恶的根源.」 时间突然停止. 我获得了可以在平行世界中穿梭的能力. 宇宙中存在着无数的平行世界,这些世界组成了一个树形的结构,每个世界有一个编号和一个幸福度. 每当我做出选择时,世界会分裂成若干个新的世界.选择会导致幸福度的变化.根据选择的不同,在新的世界里,我可能会变的更加幸福,或者更加不幸. 出于某些原因,我只能在处于相同时间的世界内穿梭,而且只能在

UVALive 4987---Evacuation Plan(区间DP)

题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2988 problem Description Flatland government is building a new highway that will be used to transport weapons from its main weapon plan

北工大2017校赛 1101:要打车的FanZzz

题目链接: http://bjutacm.openjudge.cn/lianxi/1101/ 思路: 二分 + 二分图最大匹配. 开始的时候我想直接用最小费用流模型,后来发现这样是错误的.因为这道题实际上是求一个匹配数>=n的匹配,并且满足在这个匹配中匹配边的最大的权值最小:而不是使所有匹配边的权值之和最小.这样看来就是一个典型的二分思路.首先对权值排序,每次选中原图中那些权值不能超过x的边,用这些边构建二分图.再用匈牙利算法check一下这个二分图的最大匹配数是否>=n.二分一下满足这样的条

2015 UESTC Training for Dynamic Programming A- 男神的礼物(区间dp)

A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status Lweb学长是集训队里公认的男神.有一天他要给美美的学姐姐准备礼物. Lweb学长可是会魔法的哟.为了准备一份礼物,男神要加工n份材料.每一次只能加工相邻的材料. 当男神加工两个魔法值为a,b的材料,男神都要消耗a*b的体力,同时在这个地方合成出魔法值(a+b)%100的材料. 男神