这道题位于第一章section1.4贪心部分。
题意:
给出N个山峰高度,高度属于[0,100]units;Farmer FJ需要做一些修改,来保证最高高度和最低高度的差值不大于17uints。这个修改包括减小最高山峰和增高最低山峰高度,并且修改x unit的高度要付出x^2的费用。
给出N个山峰的高度,求出满足要求修改的最小费用。
思路:
枚举所有可能的高度上下限(约定maxh-minh==17),判断此时的耗资是否最小。
排序实际上是没有必要的。只要每次都完全遍历hil[]数组,判断比下限小的靠近下限,比上限大的靠近上限就可以了。
自己写的时候下意识地排了序开了long long--毕竟在思路上还没发现坑之所在。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 typedef long long LL; 4 const int l=17; 5 int N; 6 LL a[1003]; 7 int cmp(const void *a,const void *b){ 8 return *(LL *)a-*(LL *)b; 9 } 10 LL cal(int beg,int end,int x,int y){ 11 LL ans=0; 12 for(int i=0;i<beg;i++)ans+=(a[i]-x)*(a[i]-x); 13 for(int i=end+1;i<N;i++)ans+=(a[i]-y)*(a[i]-y); 14 return ans; 15 } 16 int find(int x,int pos){ 17 int i; 18 if(!pos){ 19 i=0; 20 while(a[i]<x)i++; 21 }else { 22 i=N-1; 23 while(a[i]>x)i--; 24 } 25 return i; 26 } 27 int main(){ 28 freopen("skidesign.in","r",stdin); 29 freopen("skidesign.out","w",stdout); 30 scanf("%d",&N); 31 for(int i=0;i<N;i++)scanf("%lld",&a[i]); 32 qsort(a,N,sizeof(a[0]),cmp); 33 LL ans=1<<30; 34 for(int i=a[0];i+l<=a[N-1];i++){ 35 int p=find(i,0); 36 int q=find(i+l,1); 37 if(cal(p,q,i,i+l)<ans)ans=cal(p,q,i,i+l); 38 } 39 printf("%lld\n",ans); 40 return 0; 41 }
原文地址:https://www.cnblogs.com/ggy778/p/12231289.html
时间: 2024-11-07 00:09:48