题目大意:
给N个山峰,要求修改山峰高度使得N个山峰中最高的和最低的相差小于等于17。山峰修改x的高度,花费x2元,问怎么修改能使得花销最少
思路:
枚举所有的区间【0,17】【1,18】… 【83,100】
如果山峰在区间中,不用修改,如果在左边,修改到最小值,在右边修改到最大值
输入格式
第一行包含整数 N。
接下来 N 行,每行包含一个整数,表示一座山的高度。
输出格式
输出一个整数,表示最少花费的金钱。
数据范围
1≤N≤1000,
数据保证,每座山的初始高度都在 0∼100 之间。
输入样例:
5
20
4
1
24
21
输出样例:
18
样例解释
最佳方案为,将高度为 1 的山峰,增加 3 个单位高度
将高度为 24 的山峰,减少 3 个单位高度。
Note:
最优解不会出现不在0 - 100范围内,因为如果最优区间小于0,那么我让全部等于0就可以满足条件并且花销少。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int n;
int h[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++) cin >> h[i];
int res = 1e8;
for(int i = 0; i + 17 <= 100; i ++)
{
int ans = 0, l = i, r = i + 17;
for(int j = 0; j < n; j ++)
{
if(h[j] < l) ans += (l - h[j]) * (l - h[j]);
else if(h[j] > r) ans += (h[j] - r) * (h[j] - r);
}
res = min(res, ans);
}
cout << res << endl;
return 0;
}