| ||||||||||
| 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 | |||||||||
果然。。。真够恶心的。之前想到>-0.005要输出0.00。。。结果还是不够。。。In Reply To:跪舔啊, 数据太坑爹了。。 Posted by:3141592654ly at 2012-08-12 16:01:26 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
struct intv{
double s, e;
}intvs[505];
bool compare(const intv& i1, const intv& i2){
return (i1.s<i2.s) || (abs(i1.s-i2.s)<1e-8 && i1.e<i2.e);
}
double mx(double a, double b){
return (a>b)? a : b;
}
double clear(double d){
if(d>=0) return d+1e-8;
if(d>-0.005+1e-8) return 0;
return d-1e-8;
}
int main() {
//printf("%.2lf %.2lf\n", -0.0049, -0.005);
int gs;
while(1){
scanf("%d", &gs);
if(!gs) return 0;
int bx, by;
scanf("%d%d", &bx, &by);
int cnt = 0;
for(int i = 0; i < gs; i++){
int cx, cy, r;
scanf("%d%d%d", &cx, &cy, &r);
if(r<=0) continue;
double ka = atan2(by-cy+0.0, bx-cx+0.0);
double ap = asin(r*1.0/sqrt((bx-cx)*(bx-cx)+(by-cy)*(by-cy)+0.0));
double zuoj = ka-ap, youj = ka+ap;
intvs[cnt].s = bx - cos(zuoj)/sin(zuoj)*by;
intvs[cnt].e = bx - cos(youj)/sin(youj)*by;
cnt++;
}
sort(intvs, intvs+cnt, compare);
double st = intvs[0].s, ed = intvs[0].e;
int idx = 0;
while(idx < gs){
if(intvs[idx].s < ed+1e-8){
ed = mx(ed, intvs[idx].e);
}
else{
printf("%.2lf %.2lf\n", clear(st), clear(ed));
st = intvs[idx].s, ed = intvs[idx].e;
}
idx++;
}
printf("%.2lf %.2lf\n\n", clear(st), clear(ed));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator