遮挡判断
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 907 Accepted Submission(s): 292
Problem Description
在一个广场上有一排沿着东西方向排列的石柱子,阳光从东边以一定的倾角射来(平行光)。有的柱子可能被在他东边的高大的柱子的影子给完全遮挡住了。现在你要解决的问题是求出有多少柱子是没有被完全遮挡住的。
假设每个石柱子是一根细棒,而且都垂直于地面摆放。
假设每个石柱子是一根细棒,而且都垂直于地面摆放。
![](https://i-blog.csdnimg.cn/blog_migrate/cbc81f1d59650adf7a7d12afef9599b2.jpeg)
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。
Source
Recommend
当我调试了好久发现是因为分子和分母输错的时候,心中万匹草泥马奔腾而过,不说了,都是泪,附代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;//这道题好难啊
struct node//不会做怎么办
{
long y;//储存高度
long x;//储存X轴坐标
}t[220000];
int cmp(node a,node b)//按x轴排序
{
return a.x<b.x;
}
long i,j,k,l,m,n;
double fz,fm;//分子和分母,就是因为这两个输入反了,才无限wa的
int main()
{
while(scanf("%ld",&k),k)
{
for(i=0;i<k;i++)
scanf("%ld%ld",&t[i].x,&t[i].y);
sort(t,t+k,cmp);
scanf("%lf/%lf",&fz,&fm);
long ans=0;//先算出来,被挡住的有多少
double Max=t[0].y*1.0;//第一栋楼一定没有被完全挡住,所以他遗留下来的高度就是它本身
for(i=1;i<k;i++)
{
if(Max-(t[i].x-t[i-1].x)*fz*1.0/fm*1.0-t[i].y>=0)//若果挡住了当前这一根
{
ans++;//完全挡住的根数+1
Max=Max-(t[i].x-t[i-1].x)*fz*1.0/fm*1.0;//当前操作所遗留下来的最大的能遮挡下一根的高度
}
else
Max=t[i].y;
}
ans=k-ans;
printf("%d\n",ans);
}
return 0;
}