| ||||||||||
| 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 | |||||||||
蒟蒻的AC纪念// 684K 0ms
// 贪心
// 找出每个岛的雷达区间,以左点从小到大排序。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXLAND = 1000;
const float INF = 1999999999.9;
struct Radar
{
float lo, hi;
}radar[MAXLAND+24];
bool _cmp(Radar a, Radar b)
{
if (a.lo != b.lo)
return a.lo < b.lo;
else
return a.hi < b.hi;
}
int main()
{
int n;
int d;
int i;
int x, y;
int cir = 0;
int count = 0;
float temp;
float flag; // 右最小值
bool mark;
while (scanf("%d%d",&n, &d) == 2 && n != 0)
{
// initialize
++cir;
mark = true;
count = 0;
flag = radar[0].hi = -INF;
for (i = 1; i <= n; i++)
{
scanf("%d%d", &x, &y);
if (y > d)
mark = false;
if (mark)
{
temp = sqrt((double)(d * d - y * y));
radar[i].lo = x - temp;
radar[i].hi = x + temp;
}
}
// working hard
if (!mark)
{
printf("Case %d: -1\n",cir);
continue;
}
else
{
sort(radar+1, radar+n+1,_cmp);
for (i = 1; i <= n; i++)
{
if (radar[i].lo > flag)
{
count++;
flag = radar[i].hi;
}
else
{
if (flag > radar[i].hi)
flag = radar[i].hi;
}
}
printf("Case %d: %d\n", cir, count);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator