[USACO1.3]滑雪课程设计Ski Course Design

本文解析了USACO1.3 SkiCourseDesign问题,介绍了如何通过枚举最矮雪山高度,调整所有雪山高度至规定范围内,以最小化调整成本的方法。详细解释了算法流程,包括求解最高与最低高度差不超过17的最优方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[USACO1.3]Ski Course Design

题目描述

农民约翰的农场里有N座山峰(1<=N<=1000),每座山都有一个在0到100之间的整数的海拔高度。在冬天,因为山上有丰富的积雪,约翰经常开办滑雪训练营。

不幸的是,约翰刚刚得知税法在滑雪训练营方面有新变化,明年开始实施。在仔细阅读法律后,他发现如果滑雪训练营的最高和最低的山峰海拔高度差大于17就要收税。因此,如果他改变山峰的高度(使最高与最低的山峰海拔高度差不超过17),约翰可以避免支付税收。

如果改变一座山x单位的高度成本是x^2单位,约翰最少需要付多少钱?约翰只愿意改变整数单位的高度。

输入输出格式

输入格式:

第一行:一个整数n

第二行到N+1行:每行是一座山的海拔高度

输出格式:

约翰需要支付修改山海拔高度的总金额,最高和最低的山峰间高度差最多17。

输入输出样例

输入样例#1:

5
20
4
1
24
21

输出样例#1:

18

说明

约翰保持高度为4、20和21的山的高度。他增高高度为1的山、变成高度4(花费 3 ^ 2 = 9)。他降低了高度为24的山变成高度21也花费3 ^ 2 = 9。

题目解析

直接枚举最矮的雪山的高度h
则最高的雪山的高度则为h+17
将所有的雪山的高度都改变为h~h+17
计算出结果求最小值

代码

#include<bits/stdc++.h>
using namespace std;
int n,a[1005],ans=1e9,maxn,minn=1e8,sum;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
	  cin>>a[i];
	  maxn=max(maxn,a[i]);//求最大值
	  minn=min(minn,a[i]);//求最小值
	}
	for(int i=minn;i<=maxn-17;i++)//枚举高度
	{
	  sum=0;
	  for(int k=1;k<=n;k++)
	  {
	    if(a[k]<i)
	     sum+=pow(i-a[k],2);
	  	if(a[k]>i+17)
	  	 sum+=pow(a[k]-i-17,2);
	  }//计算当前的值
	  ans=min(ans,sum);//求最小值
	}
	cout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值