USACO 1.3.6 Ski Course Design[滑雪课程设计]
先说说思路:
这题比上一道坑人的wormholes简单多了!我一看到这题,“XXX设计”,还以为要用到什么dp呢,没想到是水题
用两层循环,第一层循环相差17中的上界,第二层遍历所有的山峰计算答案。并不断更新ans。
每座山峰分两种,第一种是大于i需要将它变矮的,第二种是小于i-17需要增加质量的。
相对于上一道题,这道题是PJ组T1,上一道算是TG组D1T2了。
代码很简单,轻松搞定。。
题目简要概述:
给出N个数(1<=N<=100),让你适当改变这些数的大小,使它们中最大数和最小数差不超过17。每改变一个数需要花费改变数量的平方块钱,比如说让这个数增加3要花费9块钱,让这个数减少5要花费25块钱,请输出使它们最大数和最小数差不超过17的最小花费
输入N+1行,第一行一个数N,第2至N+1行一行一个数。输出最小花费。
题目翻译:(用初中英语老师教的那种直译法,语句不通顺别让语文老师揍我来。。)
滑雪课程设计
农民John在他的农场上有N个山丘(1 <= N <= 1000),每一个山丘都有一个在0-100之间的整数的高度。在冬天,自从这里下了大量的雪,农民John一如既往地开启了一个滑雪训练营。
不幸的是,农民John才发现了一个新的税在下一年将要被实施用于滑雪训练营。小心地读完了规则之后,然而,他发现一个滑雪营要求最高和最低的山峰之间的差距被严格限制在17的规定。因此,如果他缩短他的最高的山峰并增加质量来增加他的比较爱的山峰的高度,农民John可以避免支付税收。
如果该边一座山峰x单位的高度花费x^2单位的钱,农民John最少要花多少钱?
农民John只能改变一座山峰的高度一次,所以每座山丘的总花费是它的原始高度和最终高度的差的平方。农民John只想要改变每座山峰的高度一个整数。
程序名:skidesign
输入格式:
第1行:整数N。
第2行至第1+N行:每一行包含一座山丘的高度。
样例输入(文件skidesign.in) :
5
20
4
1
24
21
输入描述:
农民John有五座山丘,海拔高度是1,4,20,21和24。
输出格式:
农民John需要支付来改变他的山峰的高度最小的价钱,所以最高山丘和最低山丘的最小差距是17单位。
第1行:
样例输出(文件skidesign.out):
18
输出描述:
农民John保持高度为4,20和21的山峰的高度。他给高度为1的山峰增加质量,将它变为高度4,(花费=3^2=9)。他将高度为24的山峰缩短为21,同样花费为3^2=9。
/* ID:aaabbbr1 LANG:C++ TASK:skidesign */ #include <stdio.h> int a[1001],n,ans=0; int main() { freopen("skidesign.in","r",stdin); freopen("skidesign.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); int ans=10000001; for(int i=17;i<=100;i++)//keep distance from (i-17) to i { int tmp=0; for(int j=1;j<=n;j++)//calc all the hills { if(a[j]<i-17)//it is too low tmp=tmp+(i-17-a[j])*(i-17-a[j]); if(a[j]>i)//it is too high tmp=tmp+(a[j]-i)*(a[j]-i); } if(tmp<ans)ans=tmp; } printf("%d\n",ans); fclose(stdin); fclose(stdout); return 0; }
评测结果:
USER: DONE DONE [aaabbbr1]
TASK: skidesign
LANG: C++
Compiling...
Compile: OK
Executing...
Test 1: TEST OK [0.000 secs, 4176 KB]
Test 2: TEST OK [0.000 secs, 4176 KB]
Test 3: TEST OK [0.000 secs, 4176 KB]
Test 4: TEST OK [0.000 secs, 4176 KB]
Test 5: TEST OK [0.000 secs, 4176 KB]
Test 6: TEST OK [0.000 secs, 4176 KB]
Test 7: TEST OK [0.000 secs, 4176 KB]
Test 8: TEST OK [0.000 secs, 4176 KB]
Test 9: TEST OK [0.000 secs, 4176 KB]
Test 10: TEST OK [0.000 secs, 4176 KB]
All tests OK.
YOUR PROGRAM ('skidesign') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
然后下面是测试数据...测试数据太长了...
官方给的“ANALYSIS”代码:(也不难懂,只是i循环的下界)
#include <fstream> using namespace std; int n,hills[1000]; int main() { ifstream fin("skidesign.in"); fin >> n; for (int i=0; i<n; i++) fin >> hills[i]; fin.close(); // brute-force search // try all elevation intervals from (0,17) to (83,100) int mincost=1000000000; for (int i=0; i<=83; i++) { // calculate the cost for elevation interval (i,i+17) int cost=0,x; for (int j=0; j<n; j++) { // if hill is below the interval if (hills[j]<i) x=i-hills[j]; // if hill is above the interval else if (hills[j]>i+17) x=hills[j]-(i+17); // if hill is int the interval else x=0; cost+=x*x; } // update the minimum cost mincost=min(mincost,cost); } ofstream fout("skidesign.out"); fout << mincost << "\n"; fout.close(); }