噴水裝置(nyoj6)貪心算法

噴水裝置(一)

時間限制:3000 ms  |  內存限制:65535 KB
難度:3
描述
現有一塊草坪,長爲20米,寬爲2米,要在橫中心線上放置半徑爲Ri的噴水裝置,每個噴水裝置的效果都會讓以它爲中心的半徑爲實數Ri(0<Ri<15)的圓被溼潤,這有充足的噴水裝置i(1<i<600)個,並且一定能把草坪全部溼潤,你要做的是:選擇儘量少的噴水裝置,把整個草坪的全部溼潤。
輸入
第一行m表示有m組測試數據
每一組測試數據的第一行有一個整數數n,n表示共有n個噴水裝置,隨後的一行,有n個實數ri,ri表示該噴水裝置能覆蓋的圓的半徑。
輸出
輸出所用裝置的個數
樣例輸入
2
5
2 3.2 4 4.5 6 
101 2 3 1 2 1.2 3 1.1 1 2
樣例輸出
2
5

解題思路:

1.簡單的貪心算法,因爲噴水裝置半徑有大有小,所以,優先選擇半徑大的,直到完全能覆蓋整個草坪。

2.題目中說一定能把草坪溼潤,所以不用考慮,半徑不夠大,覆蓋不了草坪寬度(2米)。也是貪心算法的雷達問題就要考慮半徑是否足夠大。

3.寬度從20米開始,增加一個噴水裝置,減少相應寬度,直到寬度小於等於零。

4.噴水裝置覆蓋的寬度用勾股定理計算出寬度。如圖:


#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;

int main()
{
	int m,n,i,j,count;
	double r[600],t,width;
	scanf("%d",&m);
	getchar();
	while(m --)
	{
		count = 0;
		scanf("%d",&n);
		for(i=0; i<n; i++)
			scanf("%lf",&r[i]);
		sort(r,r+n);//從小到大排序
		width = 20;//初始寬度爲0
		for(i=n-1; width>=0; i--)//i從n-1開始,即優先選半徑大的裝置
		{
			count ++;
			width = width - 2 * sqrt(r[i] * r[i] -1);//用勾股定理算出寬度
		}
		printf("%d\n",count);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章