洛谷P3650 [USACO1.3]滑雪课程设计Ski Course Design
题意:
给定一个数组,每次可以对数组中的任意一个数改动,改变\(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;
}