| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:我的思路和别人的不太一样,大牛帮忙看看对不对In Reply To:我的思路和别人的不太一样,大牛帮忙看看对不对 Posted by:cigaring at 2010-10-26 13:25:24 这个思路不对的
首先看这组数据
4 5
-5 3
-3 5
2 3
3 3
排序后还是这个顺序
如果按你的方法,应该得出来的是3,因为放置了第一个雷达(假设在A点)后,检测发现第二个点(-3,5)不再覆盖范围内,因此又开始以(-3,5)为点找新雷达的位置。
但是如果此时第二个点的横坐标小于A的横坐标,那么第二个点应该可以被覆盖,需要做的就是将A点向左调整。
因此你的方法,还应该加一个检测过程。这里你可以参考下我的程序。
#include <stdio.h>
#include <math.h>
typedef struct Point {
int x;
int y;
} Point;
#define LINE 1000
int group[LINE][2] = {0};
int result[LINE] = {0};
Point ilands[LINE];
int cmp(const Point * , const Point *);
int main()
{
int i , j , k;
int x , y;
int n , d;
double radar;
scanf("%d%d" , &n , &d);
k = 0;
while(n!=0)
{
for(i=0 ; i<n ; i++)
{
scanf("%d%d" , &x , &y);
if(y > d)
result[k] = -1;
ilands[i].x = x;
ilands[i].y = y;
}
if(result[k] != -1)
{
qsort(ilands , n , sizeof(Point) , cmp);
//Greedy algorithm
//for(i=0 ; i<n ; i++)
// printf("(%d , %d)\n" , ilands[i].x , ilands[i].y);
for(i=0 ; i<n ; )
{
radar = sqrt(d*d - ilands[i].y*ilands[i].y) + ilands[i].x;
result[k]++;
for(j=i+1 ; j<n ; j++)
{
if( pow(ilands[j].x-radar , 2) + pow(ilands[j].y , 2) > d*d )
{
//readjust radar in order to check whether point j can be surrounded
if((double)ilands[j].x > radar)
break;
radar = sqrt(d*d - ilands[j].y*ilands[j].y) + ilands[j].x;
}
}
i = j;
}
}
k++;
scanf("%d%d" , &n , &d);
}
for(i=0 ; i<k ; i++)
printf("Case %d: %d\n" , i+1 , result[i]);
return 0;
}
int cmp(const Point * a , const Point * b)
{
return (a->x - b->x);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator