| ||||||||||
| 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 | |||||||||
新人16MS代码水一贴#include <cstdio>
#include <utility>
#include <algorithm>
#include <cmath>
using namespace std;
typedef pair<double, double> Pair;
const int MAX_N = 1000;
bool getRange(Pair& range, Pair coor, double d){
if(d <= 0 || coor.second < 0 || coor.second > d)
return false;
range.first = coor.first - sqrt(d*d - coor.second * coor.second);
range.second = coor.first + sqrt(d*d - coor.second * coor.second);
return true;
}
int main() {
setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20);
setvbuf(stdout, new char[1 << 20], _IOFBF, 1 << 20);
int n, case_cnt = 0;
double d;
Pair coors[MAX_N];
while(scanf("%d%lf", &n, &d), n||d){
case_cnt++;
for(int i = 0;i<n;i++)
scanf("%lf%lf", &coors[i].first, &coors[i].second);
getchar();
sort(coors, coors+n);
Pair range[MAX_N];
bool flag = false;
for(int i = 0;i<n;i++)
if(!getRange(range[i], coors[i], d)){
printf("Case %d: %d\n", case_cnt, -1);
flag = true;
break;
}
if(flag)
continue;
int cnt = 1, i = 0;
while(i < n - 1){
if(range[i].second >= range[i+1].first){
if(range[i].second < range[i+1].second)
range[i+1].second = range[i].second;
}
else
cnt++;
i++;
}
printf("Case %d: %d\n", case_cnt, cnt);
}
return 0;
}
一直超时,后来看到一篇帖子恍然大悟是自己的算法错了,这道题事实上是区间问题,每一个岛屿都确定一个雷达可辐射的区间,如果两个岛屿的区间有交集,将雷达安置在交集处则可以覆盖两个岛屿,如果没有交集则说明不可能覆盖,至少需要两个雷达
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator