题意:给出一组数列,每个数大于等于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);
}