题目概述:
这道题是说农夫有n个山峰,现在已知我们的目的是要让农夫的所有山峰中最高的山和最低的山的差值不超过17,每改一单位长度的山高x的花费为x^2,每个山峰最多改一次。那么求改到满足要求的山峰的高的最小花费为多少。
算法思想:
这道题开始的时候我有一个错误的思想,就是先排序,检查最后一位和第一位的差值是不是大于17,如果是的话进行对应的砍/提高操作并改变cost,再排序再操作这样。但是这样是不对的。因为我忽略了题目中要求的“每一个山峰最多改一次高度”,如果采用的我思想,就会造成先改一个小数,排序后可能会再进行修改。这个错误让我想了很久很久才发现。
然后其实正确的思想也很简单,就是枚举最高高度即可,对于每一个最高高度,都算一遍cost,取最小值,这样想来就十分简单。不知道尼玛上一题虫洞那个为什么这么难现在还没有想到。
代码部分:
#include <iostream> #include <list> #include <map> #include <math.h> #include <string.h> #include <string> #include <fstream> #include <algorithm> using namespace std; ifstream fin("skidesign.in"); ofstream fout("skidesign.out"); int n, res; int a[1117]; int main() { fin >> n; int max = 0, tmp = 100000000; for (int i = 0; i < n; i++) { fin >> a[i]; if (a[i] > max) max = a[i]; } for (int i = 0; i <= max; i++) { int res = 0; for (int j = 0; j < n; j++) { if (a[j] < i - 17) res = res + (a[j] - i + 17)*(a[j] - i + 17); if (a[j] > i) res = res + (a[j] - i)*(a[j] - i); } tmp = tmp > res ? res : tmp; } fout << tmp << endl; return 0; }