列表

详情


NC14117. Training Plan

描述

小Q同学为了准备今年的ICPC Regional,计划在m天之内刷掉n道题,每道题有一个难度值,其中第i道题的难度值为a[i]。
然而处于半颓废状态中的小Q同学不希望在同一天中做难度差距悬殊的题目,定义第i天中刷的题的难度的最大值减最小值为d[i](如果第i天没有刷题,则d[i]=0),那么整个计划的难度为
小Q同学可以按照任意的顺序刷题,并且一天中可以刷任意多道题,但是每道题只需要做一次,现在小Q同学想知道完成这个计划的总难度的最小值是多少。

输入描述

第一行是一个正整数T(≤ 10),表示测试数据的组数,
对于每组测试数据,
第一行是两个整数n(1≤ n ≤ 500)和m(1≤ m ≤ 500),表示题数和天数,
第二行是n个整数a[i](0≤ a[i]≤ 1000000),表示每道题的难度值。

输出描述

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

示例1

输入:

2
3 3
1 2 3
3 2
1 2 3

输出:

0
1

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 239ms, 内存消耗: 2392K, 提交时间: 2022-07-22 16:36:26

#include<bits/stdc++.h>
#define LL long long
#define N 505
using namespace std;
int n,m;
LL a[N],dp[N][N];
int main(){
	int T;
	cin>>T;
	while(T--){
		int n,m;
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		sort(a+1,a+n+1);
		memset(dp,5000000,sizeof(dp));
		dp[0][0]=0;
		for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
		for(int k=j;k<=n;k++)
		dp[i][k]=min(dp[i][k],(dp[i-1][j-1]+(a[k]-a[j])*(a[k]-a[j])));
		cout<<dp[m][n]<<endl;
	}
}
 

上一题