UVALive3905 流星

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=283&page=show_problem&problem=1906

【题目描述】:在夜空下,放置一个摄像头,已知,摄像头左下角在(0,0),右上角由输入给定(w,h)。再给出n颗流星的初始位置(夜空范围内,不一定在摄像头范围内),矢量速度(VX,VY),求从开始,整个过程中,镜头内最多看到几颗流星。注意,在流星在边框上时看不到。

【思路分析】:

【一】遇到物理问题一般退化成数字模型。列两个不等式

0<x+vx*t<w (注意是开区间)

0<y+vy*t<h

【二】这样能解出一个关于变量t的公共区间,但是要注意,随着vx的正负,除完可能要变号。书上提供一个很好的方法,详细见代码,两边逼近最后的区间。

这样我们就得到了n个区间(当然,如果区间左端点大于等于右端点,应该舍去)

最终问题变成,在这数轴上的n条线段,找出一条t=x的竖线,使它穿过的横线最多。X即为所求的解。

【三】我们假设从负无穷点处开始移动这条竖线,当它从一条直线的左端点偏左(+eps),这条竖线上多穿了一条,从一条直线的右端点(这里不用考虑eps了,为什么,因为本身是开区间了),穿过的线少了一条。

但是我们不可能模拟一条直线移动(精度不够)。但是我们是能够跳跃的,即只考虑两个端点,所以先将线段排序(1、左端小的优先;2、右端小的优先)。排序的目的是O(n)的复杂度的扫描,不重不漏。

【四】额外思考:如果不排序呢?我们可以枚举每条边,在它的右端点靠左一点的位置t检测所有边是否包含这个t,最终记录最大的边数即可。但是这样复杂度就成了N*N。而排序的方法约为Nlog2(N)+N.

【完整代码】:

  1 #include<iostream>
  2
  3 #include<stdio.h>
  4
  5 #include<string.h>
  6
  7 #include<algorithm>
  8
  9 #include<stdlib.h>
 10
 11 #include<math.h>
 12
 13 #include<queue>
 14
 15 #include<vector>
 16
 17 #include<set>
 18
 19 #include<map>
 20
 21 #define MAXN 200000+5
 22
 23 #define MAXM 400000+5
 24
 25 #define oo 1e9
 26
 27 #define eps 0.001
 28
 29 #define PI acos(-1.0)//这个精确度高一些
 30
 31 #define REP1(i,n) for(int i=0;i<=(n);i++)
 32
 33 #define REP2(i,n) for(int i=1;i<=(n);i++)
 34
 35 #define LL long long
 36
 37 using namespace std;
 38
 39
 40
 41 struct Event
 42
 43 {
 44
 45     int lor;//左端点为1,右端点为2
 46
 47     double p;
 48
 49     Event(){}
 50
 51     Event(int ll,double pp){lor=ll;p=pp;}
 52
 53     bool operator <(const Event& x) const
 54
 55     {
 56
 57         if (p==x.p) return lor>x.lor;
 58
 59         else return p<x.p;
 60
 61     }
 62
 63 }event[MAXM];
 64
 65
 66
 67 int cas,w,h,n;
 68
 69 double l,r;
 70
 71
 72
 73 double maxd(double a,double b)
 74
 75 {
 76
 77     if (a>b) return a;else return b;
 78
 79 }
 80
 81 double mind(double a,double b)
 82
 83 {
 84
 85     if (a<b) return a;else return b;
 86
 87 }
 88
 89 void getVAL(double s,double v,double up)//满足0<s+vt<up
 90
 91 {
 92
 93     if (v==0)
 94
 95       if ( s<=0 || s>=up)//注意边界
 96
 97         r=l-1;//这个区间不存在
 98
 99       else return;//star将一直存在
100
101     if (v>0) {l=maxd(l,-s/v),r=mind(r,(up-s)/v);}
102
103     if (v<0) {l=maxd(l,(up-s)/v),r=mind(r,-s/v);}
104
105     return;
106
107 }
108
109
110
111
112
113 int main()
114
115 {
116
117     cin>>cas;
118
119     for(;cas;cas--)
120
121     {
122
123         cin>>w>>h>>n;
124
125         int cnt1=0;
126
127         for(int i=1;i<=n;i++)
128
129         {
130
131             double x,y,vx,vy;
132
133             cin>>x>>y>>vx>>vy;
134
135             l=0;r=oo;
136
137             getVAL(x,vx,w);
138
139             getVAL(y,vy,h);
140
141             if (l>=r) continue;
142
143             //保证区间有意义
144
145             event[cnt1++]=(Event){1,l};
146
147             event[cnt1++]=(Event){2,r};
148
149         }
150
151         sort(event,event+cnt1);
152
153         int add=0,ans=0;
154
155         for(int i=0;i<cnt1;i++)
156
157         {
158
159             if (event[i].lor==1) add++;else add--;
160
161             ans=max(ans,add);
162
163         }
164
165         cout<<ans<<endl;
166
167     }
168
169 return 0;
170
171 }

【关键词】:物理模型,边界处理

 

转载于:https://www.cnblogs.com/little-w/p/3525320.html

UVALive3905 流星相关推荐

  1. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  2. 讲座预告 | 全年最值得看的英仙座流星雨要来 如何一晚看上百流星

    斯洛伐克天文爱好者拍摄的2018年英仙座流星雨(多张叠加) 每年8月13日前后,地球都会穿过一颗彗星的尘埃带,带来一场盛大的流星雨,就是英仙座流星雨. 英仙座流星雨与象限仪座流星雨.双子座流星雨被并称 ...

  3. html正则表达式确认密码,如何使用正则表达式在流星中验证确认密码

    我使用meteor开发我的应用程序.我需要验证我的注册表单,以便限制用户.现在,我在我的注册表单中输入密码并确认密码.我正在使用正则表达式进行验证.如何使用正则表达式在流星中验证确认密码 我的代码是: ...

  4. 单片机流星灯_51单片机拖尾灯实现

    这个拖尾灯,或者扫描灯,或者流星灯,不管怎么叫,原理上估计都是一样的.这玩意困扰了我好长的时间.我知道用PWM可以做出明暗效果.但是无法做到实现多路控制. 在网上有种叫"霹雳游侠扫描灯&qu ...

  5. 流星,刹那间划过天际

    此文献给那些已经经历,正在经历或者还没有经历恋爱的人们.           流星,刹那间划过天际                                     --佛说:前生一百次回眸,换 ...

  6. 人造流星这种生日礼物,你有过吗?现在国外有了

    全世界只有3.14 % 的人关注了 数据与算法之美 数据汪列举了不同"级别"的富豪是如何庆生的,大家看看自己处于什么水平. 三流土豪的孩子过生日,看的是蜡烛... 二流土豪的孩子过 ...

  7. 代码流星雨是什么形式_为什么要在2020年与流星合作

    代码流星雨是什么形式 Meteor, an allegedly dead development platform, is still alive and can bring massive valu ...

  8. NOD32升级ID获取器For流星无语更新了

    NOD32升级ID获取器For流星无语更新了一下,现在可以直接把用户名密码写入注册表了,连复制/粘贴操作都可以免了... 转载于:https://www.cnblogs.com/lxwy/archiv ...

  9. 魔兽争霸3地图(WarIII Maps):梦若流星

    魔兽争霸3地图(WarIII Maps):梦若流星 梦若流星 游戏类型:RPG 通关时间:30分钟 流星蝴蝶剑后传, 即使孟星魂想独善其身, 也未必就能如愿------ 为了更好的体验游戏,请在在&q ...

最新文章

  1. P1064 金明的预算方案
  2. Ng-template寄宿方式
  3. IDEA连接Mysql报错: 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘.  Change driver class
  4. Qt OpenGL 问题总结
  5. 单边指数信号的特点_测试技术课后题答案1信号描述
  6. POJ1151-Atlantis【线段树,扫描线,离散化】
  7. windows下python环境搭建_Win7怎么搭建Python环境 win7系统搭建Python环境的方法
  8. [Javascript]把html内容复制到剪贴板
  9. 【优化预测】基于matlab萤火虫算法优化BP神经网络预测【含Matlab源码 1313期】
  10. scrapy-cluster scrapy集群建设
  11. 大蟒蛇Python平台相关知识
  12. 全世界国家中英文名称以及地区区号json格式【资源】
  13. 创翼linux版本,创翼电信客户端for Mac-创翼客户端Mac版下载 V1.3.7-PC6苹果网
  14. 【清华大学陈渝】第五章 虚拟存储
  15. 隐藏在Windows XP中的28个秘密武器
  16. 手机显示服务器被重置连接断开,手机服务器链接被重置
  17. oracle 官网下载
  18. 网易云音乐、微博成新规后首批IPO企业 招股书披露数据安全风险
  19. 实时数据库数据采集接口API八爪鱼采集接口
  20. MySQL 精选 60 道笔试题

热门文章

  1. [原]Oracle外部表结合游标完成统计一例
  2. MySQL---分组查询
  3. 句句真研—每日长难句打卡Day13
  4. java8 自动关闭资源_java9系列第二篇-资源自动关闭的语法增强
  5. android 按钮点击动画效果_如何用纯css打造类materialUI的按钮点击动画并封装成react组件...
  6. 五千的手机和两三千的手机使用起来有什么不一样?有必要买贵的吗?
  7. 楼房顶顶面起渣是何原因?怎么修补?
  8. 年关将至,很多朋友想要创业的心又开始蠢蠢欲动了
  9. 为什么以前的电视一打雷就容易烧坏,现在的电视就不那么怕雷?
  10. 你们的苹果手机,关闭哪些功能比较省电?