您的位置:首页 > 其它

UVA 10382 Watering Grass

2013-06-09 21:49 381 查看
其实题目是区间覆盖.

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <limits.h>
using namespace std;
const int maxn = 10010;
struct interval{
double l, r;
bool operator<(const interval & rhs)const{
return l < rhs.l;
}
}its[maxn];

int n;
double l, w;
int main(){
while (~scanf("%d%lf%lf", &n, &l, &w)){
int m = 0;
for (int i = 0; i < n; ++i){
double p, t;
scanf("%lf%lf", &p, &t);
if(w / 2 < t){
double r = sqrt(t * t - w * w / 4.0);
double x = p - r;
double y = p + r;
its[m].l = x;
its[m++].r = y;
}
}
sort(its, its + m);
double minl = its[0].l, maxr = its[0].r;
int ans = 1;
for (int i = 0; i < m; ){
int j = i, idx = -1;
double maxRight = INT_MIN;
while(j < m && its[j].l <= maxr){
if(its[j].r > maxRight && its[j].r > maxr){
maxRight = its[j].r;
}
++j;
}
if(j == i)break;
i = j;
if(maxRight != INT_MIN){
if(maxr <l){
ans++;
}
maxr = maxRight;
}

}
if(minl <= 0 && maxr >= l){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: