您的位置:首页 > 编程语言 > C语言/C++

Ski Course Design

2016-05-12 00:30 295 查看
http://train.usaco.org/usacoprob2?a=ekO1ud5KpT4&S=skidesign

题目大意:

已知N坐山的高度,调整(增加或减少)一座山的高度(x单位)花费x²元,调整山的高度使所有山之间的高度小于等于17,求最小花费

#include <iostream>
#include <fstream>
//思路1:从最低的到最高的,枚举所有的方案,如最低的增加1,2...n。递归修改每座山的高度(每重递归修改一座山)
//思路2:枚举所有可能的最低高度和最高高度
using namespace std;
int n, a[1005], ans = 1 << 30;
int price(int lowest, int highest)
{
int ans = 0;
for(int i = 1; i <= n; i++)
if(a[i] < lowest) ans = ans + (lowest - a[i])*(lowest - a[i]);
else if(a[i] > highest) ans = ans + (a[i] - highest)*(a[i] - highest);
return ans;
}
int main()
{
ifstream fin("skidesign.in");
ofstream fout("skidesign.out");
fin >> n;
int minx = 1 << 30, maxx = -1, t;
for(int i = 1; i <= n; i++)
{
fin >> a[i];
if(a[i] > maxx) maxx = a[i];
if(a[i] < minx) minx = a[i];
}
for(int i = minx; i + 17 <= maxx; i++)
{
t = price(i, i + 17);
if(ans > t) ans = t;
}
fout << (ans == 1 << 30 ? 0 : ans) << endl;
fout.close();
return 0;
}
总结:注意选择合适的枚举策略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 枚举