您的位置:首页 > 其它

POJ 1328 贪心

2012-07-09 10:36 239 查看
算法:

1.求出覆盖该岛的圆得区间, 將问题转换为求过出最少得点,保证每个区间至少有一个点。

2.按区间的左端排序

3.更新rad

View Code

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include <string.h>

#include <algorithm>

#include <math.h>

using namespace std;

struct node

{

double x, y;

bool operator < (const node& A) const

{

return x < A.x;

}

}px[10000], seg[10000];

double Circle1( double x, double y, double R)

{

return x + sqrt( R * R - y * y );

}

double Circle2( double x, double y, double R)

{

return x - sqrt( R * R - y * y );

}

int main( )

{

int n, d, ans = 1;

while( scanf("%d%d", &n, &d), n + d)

{

int t = 0, num = 0;

double ymax = 0;

for( int i = 0; i < n; i++)

{

scanf("%lf%lf",&px[i].x, &px[i].y);

if( px[i].y > ymax )

ymax =  px[i].y;

}

if( ymax > d  )

{

printf("Case %d: %d\n", ans++, -1);

continue;

}

//求出圆心区间【X,Y】

for( int i = 0; i < n; i++)

{

double x1 = px[i].x;

double y1 = px[i].y;

double Y = Circle1( x1, y1, d);

double X = Circle2( x1, y1, d);

seg[t].x = X;

seg[t].y = Y;

t++;

}

sort(seg, seg + t );
double rad = seg[0].y;
num = 1;

for( int i = 1; i < t; i++)
{
if( rad - seg[i].x > 10e-7 )
{
if( seg[i].y - rad < 10e-7 )
rad = seg[i].y;

}
else if( seg[i].x - rad > 10e-7 )
{
rad = seg[i].y;
num++;

}

}

printf("Case %d: %d\n", ans++, num);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: