AOJ-problem-853

来源:互联网 发布:二代身份证识别器java 编辑:程序博客网 时间:2024/05/21 16:11
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);elseif(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