1006 - 遮挡判断(shadow)

1006 - 遮挡判断(shadow)

这个题也比较容易。首先,要找到解题方法:要求有多少柱子没有被遮挡,就要判断每根柱子是否被前面的柱子遮挡,由题意可知:第 i 根柱子没有被遮挡的条件是前面每一根柱子与阳光所构成的三角形斜边在这一坐标上的高度小于第 i 根柱子的高度,而实质上,我们检索被第 i 根柱子遮挡住的柱子要容易得多,凡是在它后面高度低于它与阳光所构成的三角形斜边的柱子就不需要处理了。好了,这个我就不多说了,很容易明白的。而这个题首先要做的就是将每一根柱子按坐标排序,然后处理就行了。

至于排序,这个题对刚学C语言的同学来说,是有些难度的,但对学C++的同学来说,却非常简单。

下面附上两种AC代码,供大家参考:

C语言描述(采用堆排序):

ContractedBlock.gif ExpandedBlockStart.gif 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()函数):

ContractedBlock.gif ExpandedBlockStart.gif 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

转载于:https://www.cnblogs.com/gcb-1991/archive/2011/04/16/2018481.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值