ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

百度之星 拍照

2021-10-06 16:32:21  阅读:160  来源: 互联网

标签:小明 拍照 船只 ++ 航行 int 100 之星 百度


题目描述

小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左航行,有的船只向右航行。小明希望拍下这一美丽的风景,并且把尽可能多的船只都完整地拍到一张照片中。
小明位于河的边上,并且可以在河边的任意位置进行拍照,照相机的视野恰好为90度角,只能以垂直于河边的方向进行拍照。河上的船只全都可看作是平行于河边的一条线段,跟河边的距离各不相同,有的正在向左移动,有的正在向右移动,但移动速度恰好都是一样的。小明可以等待恰当的时间让尽量多的船只都走进照相机的视野里,你不需要考虑船只之间会互相遮挡视野的情况。

输入

第一行是一个数 \(n\) ,表示船只的数量。
接下来 \(n\) 行,每行四个整数 \(x,y,z,d\) ,表示船只的左端点位置、右端点位置、距离河边的距离,以及航行的方向。\(d\) 为 \(−1\) 表示向左航行,\(1\) 表示向右航行。

输出

一个整数,表示最多可以拍到多少完整的船只。

样例输入
2
1 3 1 1
2 4 1 -1
2
1 3 1 -1
2 4 1 1
1
1 4 1 1
样例输出
2
1
0

提示
30% 的数据:\(−100≤x,y≤100,1≤z≤10,n≤100\)
50% 的数据:\(−2000≤x,y≤2000,1≤z≤100,n≤2000\)
另有 30% 的数据,航行方向都相同。
100% 的数据:\(−106≤x,y≤106,1≤z≤10000,n≤100000\)


这些都是神仙qaq

特别感谢 zyk 帮助我理解这道题。 qaq他太不容易了

首先 我们可以把小船分为两个方向 向左的和向右的 分开来算

先看静止的情况

首先可以看一下 对于一个左端点在x, 右端点在y的小船在什么时候可以被完整地看到 设其离视线的高度为d

flag:后会补图

发现是在y-dx+d的一个区间

我们就可以处理出对于每种(向左的和向右的) 每个点能看到多少条船。

	for(int i= 1; i<= n; i++ )
	{
		int x, y, z, d; scanf("%d%d%d%d", &x, &y, &z, &d);
		x+= INF; y+= INF;                         //加偏移量
		int ll= y- z, rr= x+ z; 
		if(ll> rr) continue;
		if(d== 1) l[ll]++ , l[rr+ 1]-- ;
		else r[ll]++ , r[rr+ 1]-- ;
	} 
	for(int i= 1; i< N; i++ ) l[i]+= l[i- 1], r[i]+= r[i- 1];          //差分

通过初二的物理 我们可以发现 对于向左的小船来说 向右的小船是运动的(向右) (废话

然后当向左的小船向右移动时 我们的观测点也应该移动 这是显然的吧 不然他求了个寂寞

然后我们可以求一个前缀最大值

for(int i= 1; i< N; i++ ) l[i]= max(l[i], l[i- 1]);
	int ans= 0;
	for(int i= 0; i< N; i++ ) ans= max(ans, l[i]+ r[i]);

好耶

标签:小明,拍照,船只,++,航行,int,100,之星,百度
来源: https://www.cnblogs.com/lqt1217/p/15371565.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有