军训排队-模拟

Description

暑假过了,愉快的军训来了。身为学长,你知道学校今年招生招了n个班。
烈日炎炎下,每个班的小学弟小学妹,在操场上面向主席台站成了一列。各个班的新生随便站成一列,因为他们不懂事,所以也没有间隔一个固定的距离也没有按照一定的顺序(保证没有两个人在同一个位置)。你和你的好基友便坐在主席台上一边喝水一边看着他们。这是一个带有升降功能的主席台,它的高度由你决定。当然,这个主席台的高度不能小于0。
好基友:根据可靠消息,第i个班有ai个人。为什么我们看不全这么多人?
你:你读书读傻了吧。他们身高不一样,挡住了呗。
好基友:好哥们~这里是他们的体检表。第i个班有ai份,按照学号从1到ai整理好了,上面有他们的身高体重三围。老师也上报了目前大家所在的位置。你能不能立刻告诉我从我们现在的角度来看可以看见多少人?
为了解决好基友的问题,你需要写一个程序。

Input

为了方便处理,假设你所在的位置在每个列的正前上方。
第一行一个整数n代表有n个班级;
接下来有n组数据,对于每组数据:
第一行一个整数ai代表第i个班有ai个人;
接下来的ai行:
第j行包含两个整数xj,hj代表第j个学生与你的相对距离是xj,身高为hj;
最后一行以分数的形式给出你的目光与地面的夹角的正切值T/A
(假设你的目光为一条直线)。

Output

输出共n行,第i行输出f代表在第i班的正前上方(高度任意)你刚好能看见f个人。

Sample Input

1
4
0 3
3 1
2 2
1 1
1/1

Sample Output

2

Hint

【数据规模及约定】
对于60%的数据,
n≤ 5,ai≤ 1000,0≤ xj≤ 1W,0对于100%的数据,
n ≤ 5,ai≤ 3000,0≤ xj≤ 10W,0这是一个神奇的学校,体检的学生高度并没有按照cm为单位,而是他们自创的一个单位。并且,这个年级上的老师很少,所以班数不多但是每个班的人也很多。


思路

  • 纯模拟题,看代码就懂,解释:函数y=kx+b,k=u/v,b=b1/b2,注意精度问题,所以拆分为分子除分母

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#define exp 1e-6
using namespace std;
int n,u,v,b1,b2,ans;
struct fdfdfd{int x,h;}a[100005];
bool cmp(fdfdfd a,fdfdfd b){return a.x<b.x;}
int read()
{
	int f=1,x=0; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
	return f*x;
}
void jisuan_b(int x,int y){b1=v*y-u*x;}
bool jisuan_comp(int x,double y)
{
	double y2=(double)(u*1.0/v*x+b1*1.0/b2);
	if(y2+exp<y) return 1;
	return 0;
}
int main()
{
//	freopen("profit.in","r",stdin);
//	freopen("profit.out","w",stdout);
	int T; scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;++i) a[i].x=read(),a[i].h=read();
		u=read(); v=read(); u*=-1;
		sort(a+1,a+n+1,cmp);
		b2=v; jisuan_b(a[1].x,a[1].h); ans=1;
		for(int i=2;i<=n;++i)
			if(jisuan_comp(a[i].x,a[i].h)) ++ans,jisuan_b(a[i].x,a[i].h);
		printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13765550.html