1006 - 遮挡判断(shadow)
这个题也比较容易。首先,要找到解题方法:要求有多少柱子没有被遮挡,就要判断每根柱子是否被前面的柱子遮挡,由题意可知:第 i 根柱子没有被遮挡的条件是前面每一根柱子与阳光所构成的三角形斜边在这一坐标上的高度小于第 i 根柱子的高度,而实质上,我们检索被第 i 根柱子遮挡住的柱子要容易得多,凡是在它后面高度低于它与阳光所构成的三角形斜边的柱子就不需要处理了。好了,这个我就不多说了,很容易明白的。而这个题首先要做的就是将每一根柱子按坐标排序,然后处理就行了。
至于排序,这个题对刚学C语言的同学来说,是有些难度的,但对学C++的同学来说,却非常简单。
下面附上两种AC代码,供大家参考:
C语言描述(采用堆排序):
View Code
1 #include <stdio.h>//堆排序
2 struct zg
3 { int x;
4 double h;
5 };
6 void maxheap(struct zg a[],int i,int hs)
7 { struct zg t;
8 int l,r,m;
9 l=2*i;
10 r=l+1;
11 if(l<=hs&&a[l].x>a[i].x) m=l;
12 else m=i;
13 if(r<=hs&&a[r].x>a[m].x) m=r;
14 if(m!=i)
15 { t=a[i],a[i]=a[m],a[m]=t;
16 maxheap(a,m,hs);
17 }
18 }
19 void my_sort(struct zg a[],int n)
20 { struct zg t;
21 int i,j,hs,l,r,m;
22 hs=n;
23 for(i=n/2;i>0;i--)
24 maxheap(a,i,hs);
25 for(i=n;i>0;i--)
26 { t=a[i];
27 a[i]=a[1];
28 a[1]=t;
29 hs--;
30 maxheap(a,1,hs);
31 }
32 }
33
34 main()
35 {
36 int T,n,k,m,i,j;
37 char ch;
38 double b,c;
39 while(scanf("%d",&n)&&n!=0)
40 { struct zg a[n+1];
41 for(i=0;i<n;i++)
42 scanf("%d%lf",&a[i+1].x,&a[i+1].h);
43 scanf("%lf%c%lf",&b,&ch,&c);
44 c=b/c;m=0;k=0;
45 my_sort(a,n);
46 for(i=1;i<=n;i++)
47 {
48 for(j=i+1;j<=n&&(a[i].h-a[j].h)/(a[j].x-a[i].x)>=c;j++);
49 i=j-1;
50 m++;
51 }
52 printf("%d\n",m);
53 }
54 }
55
56
C++描述(直接调用sort()函数):
View Code
1 #include <cstdio>
2 #include<algorithm>
3 using namespace std;
4 struct zg
5 { int x;
6 double h;
7 };
8 bool cmp(zg a,zg b){return (a.x<b.x);}
9 main()
10 {
11 int T,n,k,m,i,j;
12 char ch;
13 double b,c;
14 while(scanf("%d",&n)&&n!=0)
15 { struct zg a[n+1];
16 for(i=0;i<n;i++)
17 scanf("%d%lf",&a[i].x,&a[i].h);
18 scanf("%lf%c%lf",&b,&ch,&c);
19 c=b/c;m=0;k=0;
20 sort(a,a+n,cmp);
21 for(i=0;i<n;i++)
22 {
23 for(j=i+1;j<n&&(a[i].h-a[j].h)/(a[j].x-a[i].x)>=c;j++);
24 i=j-1;
25 m++;
26 }
27 printf("%d\n",m);
28 }
29 }
30
31
32

浙公网安备 33010602011771号