hdu 2540 遮挡判断(数论+计算几何)

http://acm.hdu.edu.cn/showproblem.php?pid=2540

Problem Description
在一个广场上有一排沿着东西方向排列的石柱子,阳光从东边以一定的倾角射来(平行光)。有的柱子可能被在他东边的高大的柱子的影子给完全遮挡住了。现在你要解决的问题是求出有多少柱子是没有被完全遮挡住的。
假设每个石柱子是一根细棒,而且都垂直于地面摆放。
 
Input
输入包含多组数据。每组数据第一行是一个整数N(0<N<=100000),表示柱子的个数。N=0代表输入结束。接下来有N行,每行是两个整数,分别给出每根柱子的水平位置X和高度H(X越大,表示越在西边,0<=X<=10000000,0<H<=10000000保证不会有两根柱子在同一个X坐标上)。最后有一行,以分数的形式给出太阳光与地面的夹角的正切值T/A(1<=A,T<=10)。
 
Output
对每组数据,输出包含所求数目的一行。
 
Sample Input
4 0 3 3 1 2 2 1 1 1/1 0
 
Sample Output
2 提示:输入数据很多,请用scanf代替cin。
 
代码:
 1 include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 struct nod
 7 {
 8     double x,h,c;
 9 }node[100010];
10 int comp(nod a,nod b){return a.x<b.x;}
11 int main()
12 {
13     int n;
14     while(~scanf("%d",&n),n)
15     {
16         bool mark[100010]={0};
17         int i;
18         double t,a;
19         for(i=1;i<=n;i++)
20             scanf("%lf%lf",&node[i].x,&node[i].h);
21         scanf("%lf/%lf",&t,&a);
22         for(i=1;i<=n;i++)
23             node[i].c=node[i].h*a/t+node[i].x;
24         sort(node+1,node+1+n,comp);
25         int num=0,max=0;
26         for(i=1;i<=n;i++)
27         {
28             if(!mark[i])
29             {
30                 if(max<node[i].c)
31                 {
32                     max=node[i].c;
33                     num++;
34                 }
35             }
36         }
37         printf("%d\n",num);
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/crazyapple/p/2649933.html