ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CSP-S模拟测试]:军训队列(DP+乱搞)

2019-10-27 11:02:50  阅读:293  来源: 互联网

标签:6000 军训 队列 样例 乱搞 DP 身高 CSP dp


题目描述

有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方。
现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列的人数不限,请求出所有队列的不规整程度之和的最小值。


输入格式

第一行两个整数$n,k$,表示学生人数和队列数。
第二行$n$个实数,表示每名学生的身高。身高范围在$140\sim 200cm$之间,保留两位小数。


输出格式

一个实数表示答案,保留$2$位小数。


样例

样例输入1:

3 2
170.00 180.00 168.00

样例输出1:

4.00

样例输入2:

5 2
170.00 180.00 168.00 140.59 199.99

样例输出2:

1023.36


数据范围与提示


题解

$50$分的$DP$应该都会打,问题就在于如何优化。

的确可以斜率优化,但是考虑身高的范围,也就是说最多有$6000$种不同的身高。

那么离散化一下不就$AC$啦?

再考虑另一种并不正确的算法,尽可能让平方差最大的一组最小;的确是错的,第二个样例都过不了,但是在数据范围比较大的时候很难被卡;再结合前面暴力$DP$即可拿到满分……

时间复杂度:$\Theta(6000\times 6000)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,k;
double h[100001];
double dp[100001][21];
double ans=1000000000.0;
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)scanf("%lf",&h[i]);
	sort(h+1,h+n+1);
	n=unique(h+1,h+n+1)-h-1;
	for(int i=1;i<=n;i++)dp[i][1]=(h[i]-h[1])*(h[i]-h[1]);
	for(int j=2;j<=k;j++)
		for(int i=1;i<=n;i++)
		{
			dp[i][j]=10000000000.0;
			for(int l=i;l>=j;l--)
				dp[i][j]=min(dp[i][j],dp[l-1][j-1]+(h[i]-h[l])*(h[i]-h[l]));
		}
	printf("%.2lf",dp[n][min(n,k)]);
	return 0;
}

rp++

标签:6000,军训,队列,样例,乱搞,DP,身高,CSP,dp
来源: https://www.cnblogs.com/wzc521/p/11746874.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有