USACO skidesign

题意:给出一组数列,每个数大于等于0小于等于100,把一个数+x要x平方的代价,求使得极差小于等于17的最小代价。
这题做了我蛮久,我TM真是个傻逼。
一开始我用set的第一个和最后一个元素去分摊差值,然后循环搞直到满足条件为止,然而这是错的,用许多组一样的数和一个很大的数可卡。后来结合数轴,看了很久才发现,我的目的就是要把这些数都挪到一个长度为17的区间内,于是考虑枚举这个区间,贪心计算每个区间的答案即可。
妈的我真是个傻逼。~听说恋爱中的男人会变傻~

/* ID: d2947901 PROG: skidesign LANG: C++ */
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<set>
#define X first
#define Y second
#define LL long long
#define pii pair<int,int>
#define MP make_pair
#define INF 0x3f3f3f3f
#define DEBUG(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
const int MAXN=1001;
int h[MAXN],n,res=INF;
int main()
{
    freopen("skidesign.in","r",stdin);
    freopen("skidesign.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>h[i];
    for(int i=0;i<=100-17;i++)
    {
        int ans=0;
        for(int j=1;j<=n;j++)
        {
            int k=min(abs(i-h[j]),abs(i+17-h[j]));
            if(h[j]>=i&&h[j]<=i+17)continue;
            ans+=k*k;
        }
        res=min(res,ans);
    }
    printf("%d\n",res);
}

你可能感兴趣的:(USACO)