USACO Ski Course Design

来源:互联网 发布:c语言编写安卓 编辑:程序博客网 时间:2024/04/29 16:59
【标签】暴力,贪心


【题意】给定长度为N的序列A,将序列元素A[i]更改k所用的花费为k*k,求更改使得序列最大最小元素的差在17以内且花费最小,求花费。
0<=A[i]<=100, 1<=N<=1000


【分析】
先把A排一下序吧,反正时间多得是......
发现A这么小,那么就直接枚举最大值up(0-100),找到相对应的最小值down=up-17。
然后贪心取最优的情况:
①A数列的最大值变成枚举的最大值
②A数列的其他数p
当p<down时,有p变到down
当down<=p<=up时,不管你事就不变了
当up<p时,把p变到up
然后和当前的最优解进行比较,最终取到一个最小的就OK了


【代码】
/*
{
ID:y2007031
PROG:skidesign
LANG:C++
}
*/


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>


using namespace std;


const int MAX=1000000000;


int n,h[1001];
int down,up,res=MAX,sum;


int main(void)
{
freopen("skidesign.in","r",stdin);
freopen("skidesign.out","w",stdout);

scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&h[i]);
sort(h+1,h+n+1);

for (up=100;up+1;up--)
{
down=up-17;
sum=abs(h[n]-up)*abs(h[n]-up);
for (int i=1;i<n;i++)
{
if (h[i]<down) sum+=(h[i]-down)*(h[i]-down);
if (h[i]>up) sum+=(up-h[i])*(up-h[i]);
}
res=sum<res?sum:res;
}
printf("%d\n",res);

return 0;
}


【总结】找数据范围小的东西作为循环的结构,因为时间复杂度要小啊
0 0
原创粉丝点击