USACO Ski Course Design解析和C语言实现

题目大意:

John农场有N1=<N<=1000)小丘陵(山),它们高度的范围从到 100 但仅仅有当最大的高度差不大于17时。才干够避税。John对它们进行改造,从高的丘陵上取土放到较矮的丘陵上,每改变 单位的高度。将会花费 x^2的钱。每一个丘陵的高度仅仅能改变一次。每次改变的值为整数。

 

PROGRAM NAME: skidesign
INPUT FORMAT

第一行:一个整数n 第二行到N+1行:每行是一座山的海拔高度

SAMPLE INPUT (file skidesign.in)

5 20 4 1 24 21

(约翰的农场有5座山,海拔为1,4,20,21和24)

OUTPUT FORMAT

约翰须要支付改动山海拔高度的总金额,最高和最低的山峰间高度差最多17。

SAMPLE OUTPUT (file skidesign.out)

18

(约翰保持高度为4、20和21的山的高度。他增高高度为1的山、变成高度4(花费 3 ^ 2 = 9)。

他减少了高度为24的山变成高度21也花费3 ^ 2 = 9。)

 


这道题開始的时候,想到差值是在于最高和最低峰值间。故先排序。获得最大最小值。检查差值是不是大于17,大于则更改,然后循环排序检查。直到所有满足。但这样比較复杂,事实上就是在使所有的高度都在  一个差值小于等于17  的区间 范围内。

 

解法:

直接枚举长度为17的区间范围(0-100内,(0,17) , (1,18), (2,19), ..., (83,100))。

计算全部山峰要在这个范围内,改变山的高度所须要花费的成本。


/*
ID: abc18711
LANG: C
TASK: skidesign
*/

#include <stdio.h>

#define MAXN 1001

int main()
{
 	int N;
	int hills[MAXN];
	
	int i, j;	
	
	int cost;
	int mincost;

	FILE *fin = fopen("skidesign.in", "r");
	FILE *fout = fopen("skidesign.out", "w");
	
	fscanf(fin, "%d", &N);
	
	for (i=0; i<N; i++)
		fscanf(fin, "%d", &hills[i]);

	//all the possible interval
	
	mincost = 99999999;
	for (i=0; i<=83 ;i++)
	{
		//the current interval is [i,i+17]

		cost = 0;
		
		//judge every hills
		for (j=0; j<N; j++)
		{
			if (hills[j] < i)
				cost += (i-hills[j])*(i-hills[j]);
			else if (hills[j] > (i+17)) 
				cost += (hills[j]-i-17)*(hills[j]-i-17);
		}

		if (mincost > cost) mincost = cost;
	}
	
	fprintf(fout, "%d\n", mincost);
	
	fclose(fin);
	fclose(fout);
	
	return 0;
}






posted on 2017-06-19 09:44  blfbuaa  阅读(137)  评论(0编辑  收藏  举报