简单的贪心 poj1328

关于这道题,我想说的是还是练的题少了,所以就老是考虑不周全的!

#include<iostream>
#include<cmath>
using namespace std;
typedef struct fun
{
	double x,y;
}rr;
fun a[1005];
bool vis[1005]; 
int cmp(const void *a,const void *b)
{
		fun *c=(fun *)a;
		fun *d=(fun *)b;
		if(c->x==d->x)
			return c->y>d->y?-1:1;   
		else 
			return c->x>d->x?1:-1; 
}
int main()
{
	int n,i,sign,Count=0,sum;
	double d,t,x,mi,ma;
	while(1)
	{
		Count++;
		sign=0;
		cin>>n>>d;
		if(n==0 && d==0)
			break;
		for(i=0; i<n; i++)
		{
			cin>>a[i].x>>a[i].y;
			if(a[i].y>d)
				sign=1;//代表是没有办法建立的
		}
		if(sign==1)
		{
			cout<<"Case "<<Count<<": "<<"-1"<<endl;
			continue;
		}
		qsort(a,n,sizeof(fun),cmp);
		i=0; 
		sum=0;
		while(i<n)
		{ 
			sum++;
			x=a[i].x+sqrt(d*d-a[i].y*a[i].y);//这个是最远的
			while(1)
			{
				i++;
				if(i>=n)
					break;
                mi=a[i].x-sqrt(d*d-a[i].y*a[i].y);
				ma=a[i].x+sqrt(d*d-a[i].y*a[i].y);//可以使最远的
				if(mi>x)
					break; 
				if(ma<x)
					x=ma;
					
			}
		}
		cout<<"Case "<<Count<<": "<<sum<<endl;
	}	
	return 0;

}


 

你可能感兴趣的:(简单的贪心 poj1328)