AOJ-problem-853

SLF 改造计划
Description
俗话说得好,精卫填海,LF 平山。作为处女座的 SLF 强迫症有很多,他学成后买下一个荒无人烟的山丘地带,但是山的高度很是令他烦恼,于是他决定要用最小的代价让最高的山峰与最低的山峰的高度差不超过 17,SLF 经过调查,已知第 i 座山峰高度为 a[i],由于填山或是平山都需要代价,SLF 询问了专业人员,将高度为 a[i]的山峰改造成高度为 x 的山峰的代价为(a[i] – x)^ 2,经过苦难的他深知赚钱的不容易,所以他希望代价最小。


Input
第一行一个数 n。
接下来 n 行每行一个整数 a[i](0 ≤ a[i] ≤ 100),表示山峰高度。


Output
一行一个整数,最小的代价

思路:
本来以为不可以让山变高的
暴力:经过我们的改造,这些山的高度在一个区间长度不大于17的范围内,我以区间内的最高山(R)为基准,改造后的所有山的高度在区间[R-17,R],以最低山为基准自然也可以。
优化:(三分)
#include<iostream>
using namespace std;
#include<cmath>
#include<algorithm>
const int length=1000+10;
int a[length],n;

int cost(int one,int two)
{
        if(two>one)
		return (two-one)*(two-one);
	else
		if(two+17<one)
		return (one-17-two)*(one-17-two);
		else return 0;
}

int sum(int num)
{
	int s=0;
	for(int i=0;i<n;i++)
		s+=cost(num,a[i]);
	return s;
}

int main()
{
	cin>>n;
	for(int i=0;i<n;++i) cin>>a[i];
	sort(a,a+n);
	int l=a[0],r=a[n-1],lmid,rmid;
	while(l+2<r)
	{
		lmid=(2*l+r)/3,rmid=(l+2*r)/3;
		if(sum(lmid)<sum(rmid)) r=rmid;else l=lmid;
	}
	int ans=sum(l);
	for(int i=l+1;i<=r;++i) ans=min(ans,sum(i));
	cout<<ans;
	cin.get();
	cin.get();
	return 0;
}

 
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值