洛谷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;
}

posted @ 2020-03-30 18:56  panjx  阅读(197)  评论(0编辑  收藏  举报