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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值