題目概述:
這道題是說農夫有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; }