以前做过的,也是贪心算法的应用,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.
}
本文探讨了贪心算法在解决特定问题时的实际应用案例,详细介绍了算法的实现过程及关键细节,通过实例分析帮助理解算法的正确使用方式。
500

被折叠的 条评论
为什么被折叠?



