hdu 2540 遮挡判断 判断有多少根柱子的投影没有被完全遮挡

来源:互联网 发布:sql declare 多个变量 编辑:程序博客网 时间:2024/04/27 12:23

遮挡判断

Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 659    Accepted Submission(s): 197


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
40 33 12 21 11/10
 

Sample Output
2提示:输入数据很多,请用scanf代替cin。
 

Source
UESTC 6th Programming Contest Online
 

Recommend
lcy
 


思路:  每个柱子都会在x轴上映射出一个区间   那么只要看被包含的区间有多少个 用总的减去被包含的区间的个数即可


#include<stdio.h>#include<string.h>#include<stdlib.h>struct haha{     double s;     double h;     double e;}a[111111];//bool  vis[10000000+100];int cmp(const void *a,const void *b){    return (*(struct haha *)a).s>(*(struct haha *)b).s?1:-1;}int main(){    int n,i,j;    while(scanf("%d",&n)!=EOF)    {        if(!n) break;        double tan,c,b;        for(i=0;i<n;i++)            scanf("%lf %lf",&a[i].s,&a[i].h);         scanf("%lf/%lf",&c,&b);         tan=c/b;         //printf("%lf\n",tan);         qsort(a,n,sizeof(a[0]),cmp);         for(i=0;i<n;i++)         {              a[i].e=a[i].s+a[i].h/tan;            //  printf("s=%lf e=%lf\n",a[i].s,a[i].e);         }         int cnt=n;         double s,e;         s=a[0].s;e=a[0].e;         for(i=1;i<n;i++)         {              if(a[i].e<=e&&a[i].s>=s) cnt--;              else              {                  if(a[i].e>e)  {e=a[i].e;s=a[i].s;}              }         }         printf("%d\n",cnt);    }     return 0;}






原创粉丝点击