『HDU 5714』拍照

传送门戳我!~

题目描述(稍有修改)

小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左航行,有的船只向右航行。小明希望拍下这一美丽的风景,并且把尽可能多的船只都完整地拍到一张照片中。

小明位于河的边上,并且可以在河边的任意位置进行拍照,照相机的视野恰好为90度角,只能以垂直于河边的方向进行拍照。河上的船只全都可看作是平行于河边的一条线段,跟河边的距离各不相同,有的正在向左移动,有的正在向右移动,但移动速度恰好都是一样的。小明可以等待恰当的时间让尽量多的船只都走进照相机的视野里,你不需要考虑船只之间会互相遮挡视野的情况。

如图,阴影部分是相机放在坐标4的时候的摄像范围,绿色的线段是向右的船只,黄色的线段是向左的船只。1秒以后,可以同时排到5艘完整的船。

现在的问题是,小明可以任意的选择拍摄的地点和时间,问:他最多能一次性拍到多少艘完整的船?

解题思路

首先我们发现原本的题意是一个二维的平面,但是长度最长有 2 * 10 ^ 6 显然,用二维的做法显然是不可以的。

我们要想一想怎么才能把这道题转化为一个一维的问题:

其实,假设一条船净值在一个地方,那我们在岸上能完整看到它的范围就知道了,显然这个范围是和船的长度和距离岸边的长度共同决定的。如下图所示:

假设红色是船,黑色是岸,绿色就是可以完全看见船的范围了。

我们很容易可以想到,要将两个方向的船分开处理。我们利用差分和前缀和就可以分别处理出来某个点上可以看到的向右行驶的船和向左行驶的船的数量,又因为要能同时看到向左的船和向右的船,所以选择的向右的位置一定在想做的位置的左边,这样,船一定会相遇,但相遇在哪里我们就不关心了。利用一个数组简单处理一下就可以了。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn=1e6+100000;
 7 int n;
 8 int chafeny[2*maxn],chafenz[2*maxn];
 9 int hey[2*maxn],hez[2*maxn];
10 int main(){
11     int T;
12     scanf("%d",&T);
13     for(register int t=1;t<=T;t++){
14         memset(chafeny,0,sizeof(chafeny));
15         memset(chafenz,0,sizeof(chafenz));
16         memset(hey,0,sizeof(hey));
17         memset(hez,0,sizeof(hez));
18         scanf("%d",&n);
19         for(register int i=1,x,y,z,d;i<=n;i++){
20             scanf("%d%d%d%d",&x,&y,&z,&d);
21             x+=maxn;
22             y+=maxn;
23             int disx=y-z,disy=x+z;
24             if(disx>disy)continue;
25             if(d==1){
26                 chafeny[disx]++;
27                 chafeny[disy+1]--;
28             }
29             else {
30                 chafenz[disx-1]--;
31                 chafenz[disy]++;
32             }
33         }
34         int ans=0;
35         hey[0]=max(hey[0],chafeny[0]);
36         for(register int i=1;i<maxn*2;i++){
37             chafeny[i]=chafeny[i-1]+chafeny[i];
38             hey[i]=max(hey[i-1],chafeny[i]);
39         }
40         hez[maxn*2-1]=max(hez[maxn*2-1],chafenz[maxn*2-1]);
41         for(register int i=maxn*2-2;i>=0;i--){
42             chafenz[i]=chafenz[i+1]+chafenz[i];
43             hez[i]=max(hez[i+1],chafenz[i]);
44             ans=max(ans,hez[i]+hey[i]);
45         }
46         printf("Case #%d:\n",t);
47         printf("%d\n",ans);
48     }
49 }

原文地址:https://www.cnblogs.com/Fang-Hao/p/9498588.html

时间: 2024-10-14 10:03:04

『HDU 5714』拍照的相关文章

『昼颜』读后感

『昼颜』读后感       <--故事梗概-->---------------------------------------------------------------------------------------------------   纱和和北野居然恋爱了,仔细想想, 一个是超市的收银员,一个是高中老师,都有充足的时间, 但是,他们都有自己的家庭.   基于自己的最优选择,还是宽容, 后来各自的家庭必须要拆散他们,所以也就用不再见了, 最后,纱和开始了自己独立的生活...  

[TYVJ1827]『Citric II』一道防AK好题

时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的题目太简单了,于是他决定,这次要给参赛选手们一个下马威! ^_^ Lemon手上有一个长度为n的数列,第i个数为xi.他现在想知道,对于给定的a,b,c,他要找到一个i,使得a*(i+1)*xi^2+(b+1)*i*xi+(c+i)=0成立.如果有多个i满足,Lemon想要最小的那个i.Lemon有

Github 恶搞教程(一起『玩坏』自己的 Github 吧)

最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发现原来有人已经做出『玩坏』Github 的工具啦,名叫 gitfiti.主要对应预先定义的模板,进行相应日期的 commit 操作,push 至 Github 后在贡献栏中生成相应像素点,并且利用 Github 贡献数不同颜色深度不同的机制,就可以在自己的贡献栏里面看见像素画了.怎么样,是不是心动啦,那么下面

『安全工具』注入神器SQLMAP

原文:『安全工具』注入神器SQLMAP Pic by Baidu 0x 00 前言 正是SQLMAP这种神器的存在,SQL注入简直Easy到根本停不下来.... PS:国内类似软件也有阿D,明小子,挖掘机,当你用过他们之后你才会发现SQLMap才是绝对的注入神器 0x 01 注入原理 *****************************************开始分割线***************************************** 时间原因,这段内容就先不写了 就是因为

Linux基本功杂记——[020]——『Linux Capability』

『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged proc

零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异

原文:零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异 因为先前写到自制Button时需特别注意Template Binding步骤的部分,有不少网友常常问我差异到底在哪? 所以在这边就特别为了Template Binding做单独的介绍 ? 因为先前写到自制Button时需特别注意Template Binding步骤的部分,有不少网友常常问我差异到底在哪? 所以在这边就特别为了Template

2017-2018-2 165X 『Java程序设计』课程每周成绩公布(0329更新)

2017-2018-2 165X 『Java程序设计』课程 每周成绩公布(0329更新) 本博客将跟随教学进度不定期更新,每次更新后将在课程群公布.如对成绩有疑问,请于公布成绩后的1天之内联系助教,进行审核确认. --------CONTENTS-------- 课下测试 Linux命令基础测试 第一周测试(CH01) 课堂实践 加扣分 Java实验 『总成绩』 第一周 第二周 课下测试 Linux命令基础测试 学号 测试成绩 规格化成绩 Blog 总分 20145209 0 0 0 20155

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: 需求分析 功能要求 1.自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 =: 10 - 5 = 之类的两个数,一个运算符的题目 2.题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 判断用户答题正误,并输出正确结果 3.支持真分数 可独立使用 实现分数算式的

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算

2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 组内成员 20172327 马瑞蕃 20172320 李闻洲 20172317 蒋子行 需求分析 自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目 不同等级的题目应该指的是不同难度的题目,意味着题目的复杂程度随着等级的上升而上升 题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 自动生成的题目要先转为后缀表达式,并计算这个后缀表达式 判断用户答题正误,并输出正