poj 1328:Radar Installation

解題思路:

貪心法

(1)將x軸上可覆蓋雷達的區間算出,按照左端點遞增排序

(2)每次將雷達放置在區間的右端點

(3)當下一個區間的左端點在雷達左側,檢查右端點

----a. 若右端點在雷達左側,將雷達放在右端點

----b. 若右端點在雷達右側,不必更新

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;

struct island
{
	double x,y;
	double left,right;	
};
island v[1010];

int cmp(const void * a,const void * b)
{
	if(((island*)a)->left>((island*)b)->left)
		return 1;
	return 0;
}

int main()
{
	int n,d;
	bool flag;
	int c = 0;
	while(cin>>n>>d)
	{
		if(n==0 && d==0)
			break;
		c++;
		flag = true;
		for(int i=0;i<n;i++)
		{
			cin>>v[i].x>>v[i].y;
			if(v[i].y > d)
				flag = false;
			else
			{
				v[i].left = v[i].x - sqrt(d*d - v[i].y*v[i].y);
				v[i].right = v[i].x + sqrt(d*d - v[i].y*v[i].y);
			}
		}
		//無解 
		if(flag == false)
		{
			cout<<"Case "<<c<<": "<<-1<<endl;
			continue;
		}
		//有解 
		qsort(v,n,sizeof(v[0]),cmp);
	
		int m=1;
		double r;
		r=v[0].right;
                             
		for(int i=1;i<n;i++)
		{
			//把雷達放在區間右側 
			if(v[i].left>r)
			{
				m++;
				r=v[i].right;
			}
			//左移雷達覆蓋新區間 
			else
			{
				if(v[i].right<r)
					r=v[i].right;
			}
		}
		cout<<"Case "<<c<<": "<<m<<endl;	
	}
	return 0;
} 


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