USACO Section 1.3 Ski Course Design 解题报告
2016-10-06 23:48
525 查看
题目
题目描述
有N座山,每座山都有一个高度,现在由于农夫想避税,所以想把这些山的高度进行一些改变,使得最高的山与最低的山之间的高度差不超过17。每座山最多只能改变一次高度,每次改变高度都会产生一定的费用,如果改变了X高度,那么将会产生X^2的费用,现在需要计算最少需要支付的金额。
数据范围
1 <= N <= 1000,每座山的高度在
0~100之间的一个整数,改变前后山的高度都是整数。
样例输入
首先输入一个N,代表有N座山,下面N行数字代表每座山的高度5 20 4 1 24 21
样例输出
18
解题思路
首先找到最高的山与最低的山,最终的最优结果肯定是改变之后最矮的山的高度位于最大值与最小值之间,利用这个思路,直接枚举最大值与最小值之间的所有的高度h,然后使所有的山的高度都位于区间[h, h+17],最终选一个最小代价方案。时间复杂度为
O(100 * 1000)。
解题代码
/* ID: yinzong2 PROG: skidesign LANG: C++11 */ #define MARK #include<cstdio> #include<algorithm> using namespace std; const int MAXN = 1000+10; const int INF = 0x3fffffff; int hills[MAXN]; int n; int main() { #ifdef MARK freopen("skidesign.in", "r", stdin); freopen("skidesign.out", "w", stdout); #endif // MARK while(~scanf("%d", &n)) { int _min = INF, _max = 0; for(int i = 0; i < n; i++) { scanf("%d", &hills[i]); _min = min(_min, hills[i]); _max = max(_max, hills[i]); } int l,r; int ans = INF; for(int i = _min; i <= _max; i++) { l = i; r = i+17; int sum = 0; for(int j = 0; j < n; j++) { if(hills[j] < l) { sum += ((l-hills[j])*(l-hills[j])); } if(hills[j] > r) { sum += ((hills[j]-r)*(hills[j]-r)); } } ans = min(ans, sum); } printf("%d\n", ans); } return 0; }
相关文章推荐
- USACO Section1.3 Ski Course Design 解题报告
- USACO-Section1.3 Ski Course Design [模拟]
- USACO-Section 1.3 Ski Course Design(枚举)
- USACO Section 1.3 Ski Course Design
- USACO - Chapter1 Section 1.3 - Ski Course Design
- USACO-Section 1.3 Ski Course Design
- USACO-Section1.3 Ski Course Design
- USACO Section 1.3 Ski Course Design
- USACO Ski Course Design 解题报告
- USACO-Section1.3 Ski Course Design【暴力枚举】
- USACO-Section1.3 Ski Course Design
- USACO-Section 1.3 Ski Course Design Lock[...]
- USACO section 1.3 Ski Course Design
- USACO Section 1.3 Barn Repair 解题报告
- USACO 1.3 Ski Course Design 转化
- USACO 1.3 Ski Course Design
- USACO 1.3 Ski Course Design (枚举)
- USACO 1.3 Ski Course Design
- USCAO-Section 1.3 Ski Course Design
- USACO Ski Course Design 解题日志