题意:
给定一个数组,每次可以对数组中的任意一个数改动,改变(x)数值要(x²)的代价,要求数组中的最大数与最小数的差小于(17)。
(n≤1000),数组中每个数(≤100)
思路:
一看这数据就可以得出,(O(N^2))轻松水过。
因为每个数都小于等于100,所以我们枚举最大值从(1)到(100),每次求出当最大值为(i)的时候,将所有数改动成符合要求所花费的代价,从中间取最小值,输出即可。
code:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int N=10005;
long long ans=0x7f7f7f7f,a[N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=17;i<=100;i++)//最大值最小是17,不是1,要不然都成负的了
{
long long sum=0;
for(int j=1;j<=n;j++)
{
if(a[j]<i-17)//如果比最小值小,则加上
{
sum+=(i-17-a[j])*(i-17-a[j]);
}
else if(a[j]>i)//如果比最大值大,则削去
{
sum+=(a[j]-i)*(a[j]-i);
}
}
ans=min(ans,sum); //对所有求出的代价取min
}
cout<<ans;
return 0;
}