#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps = 10e-9;
struct Sprinkler
{
double start, end;
bool operator< (const Sprinkler &a) const
{
return start < a.start;
}
} s[10010];
int main()
{
int n, l, w, i, suc;
while (scanf("%d%d%d", &n, &l, &w) == 3)
{
suc = 0;
int k = 0;
//initialize
for (i = 0; i < n; i++)
{
int p,r;
double x,y,d;
scanf("%d%d", &p,&r);
if(2 * r <= w)
x = y = l + 1.0;
else
{
d = sqrt(r*r - (double)w * w / 4.0);//神坑
x = p - d;
y = p + d;
}
s[i] = (Sprinkler){x,y};
}
sort(s, s+n);
double last = 0, maxv = 0;
int ans = 0;
//greedy
for (i = 0; i < n; i++)
{
if (last - s[i].start < -eps)
{
//failure
if (maxv - s[i].start < -eps)
{
suc = 0;
break;
}
//safe
ans++;
last = maxv;
}
maxv = max(maxv,s[i].end);
if (s[i].end - l > -eps)
{
ans++;
suc = 1;
break;
}
}
if (suc) printf("%d\n", ans);
else printf("-1\n");
}
return 0;
}
对,就是那句打着“神坑”的代码,导致这一个程序WA。如果改成
d = sqrt(r*r - w * w / 4.0);
或d = sqrt(double(r*r - w * w / 4.0));
还是WA。但如果改成
d = sqrt((double)r*r - w * w / 4.0);
或d = sqrt((double)r*r - (double)w * w / 4.0);
然后就AC了!就AC了……
我为这一个题已经交了22遍了……我打这些字的时候还不放心,又交了1遍正确的,真的是AC……感觉不像是人品问题
那么是哪里有问题??求各路大神指教!!
#include<algorithm>
#include<cmath>
using namespace std;
const double eps = 10e-9;
struct Sprinkler
{
double start, end;
bool operator< (const Sprinkler &a) const
{
return start < a.start;
}
} s[10010];
int main()
{
int n, l, w, i, suc;
while (scanf("%d%d%d", &n, &l, &w) == 3)
{
suc = 0;
int k = 0;
//initialize
for (i = 0; i < n; i++)
{
int p,r;
double x,y,d;
scanf("%d%d", &p,&r);
if(2 * r <= w)
x = y = l + 1.0;
else
{
d = sqrt(r*r - (double)w * w / 4.0);//神坑

x = p - d;
y = p + d;
}
s[i] = (Sprinkler){x,y};
}
sort(s, s+n);
double last = 0, maxv = 0;
int ans = 0;
//greedy
for (i = 0; i < n; i++)
{
if (last - s[i].start < -eps)
{
//failure
if (maxv - s[i].start < -eps)
{
suc = 0;
break;
}
//safe
ans++;
last = maxv;
}
maxv = max(maxv,s[i].end);
if (s[i].end - l > -eps)
{
ans++;
suc = 1;
break;
}
}
if (suc) printf("%d\n", ans);
else printf("-1\n");
}
return 0;
}
对,就是那句打着“神坑”的代码,导致这一个程序WA。如果改成
d = sqrt(r*r - w * w / 4.0);
或d = sqrt(double(r*r - w * w / 4.0));
还是WA。但如果改成
d = sqrt((double)r*r - w * w / 4.0);
或d = sqrt((double)r*r - (double)w * w / 4.0);
然后就AC了!就AC了……
我为这一个题已经交了22遍了……我打这些字的时候还不放心,又交了1遍正确的,真的是AC……感觉不像是人品问题

那么是哪里有问题??求各路大神指教!!