以前做过的,也是贪心算法的应用,wa了好多次,中间有几个细节没考虑到,这次贴出来备忘 点击打开链接
#include<stdio.h>
02.
#include<stdlib.h>
03.
#include<math.h>
04.
struct
IN
05.
{
06.
double
a;
07.
double
b;
08.
}s[10005];
09.
int
cmp(
const
void
*m,
const
void
*y)
10.
{
11.
struct
IN *c = (IN *)m;
12.
struct
IN *d = (IN *)y;
13.
if
(c->a !=d->a)
14.
return
c->a - d->a;
15.
else
16.
return
d->b - c->b;
17.
}
18.
int
main()
19.
{
20.
int
x,r,i,k,n,t,w,h,count,j,q;
21.
double
h1,min,max,max_1,max_2;
22.
scanf
(
"%d"
,&t);
23.
while
(t--)
24.
{
25.
k=0;
26.
scanf
(
"%d%d%d"
,&n,&w,&h);
27.
min=h+1; max=-1;
28.
h1=1.0*h/2;
29.
for
(i=0;i<n;i++)
30.
{
31.
scanf
(
"%d%d"
,&x,&r);
32.
if
(r>=h1)
33.
{
34.
s[k].a=x-
sqrt
(r*r-h1*h1);
35.
s[k].b=x+
sqrt
(r*r-h1*h1);
36.
if
(s[k].a<0)
37.
s[k].a=0;
38.
if
(s[k].b>w)
39.
s[k].b=w;
40.
if
(min>s[k].a)
41.
min=s[k].a;
42.
if
(max<s[k].b)
43.
max=s[k].b;
44.
k++;
45.
}
46.
}
47.
if
(min>0||max<w)
48.
{
49.
printf
(
"0\n"
);
50.
continue
;
51.
}
52.
qsort
(s,k,
sizeof
(s[0]),cmp);
53.
max_1=s[0].b; count=1; q=1;
54.
for
(i=q;i<k;i++)
55.
{
56.
if
(max_1==w)
57.
break
;
58.
max_2=max_1; //这段细节要考虑一下,每次取前面右端点的最大值
59.
for
(j=i;j<k;j++)
60.
{
61.
if
(s[j].b>max_1&&s[j].a<=max_2)
62.
{
63.
max_1=s[j].b;
64.
q=j;
65.
}
66.
}
67.
count++;
68.
if
(max_1==w)
69.
break
;
70.
}
71.
if
(max_1<w)
72.
printf
(
"0\n"
);
73.
else
74.
printf
(
"%d\n"
,count);
75.
}
76.
return
0;
77.
}