UVALive3905 流星
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 流星相关推荐
- 小程序 缩放_缩放流星应用程序的初体验
小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...
- 讲座预告 | 全年最值得看的英仙座流星雨要来 如何一晚看上百流星
斯洛伐克天文爱好者拍摄的2018年英仙座流星雨(多张叠加) 每年8月13日前后,地球都会穿过一颗彗星的尘埃带,带来一场盛大的流星雨,就是英仙座流星雨. 英仙座流星雨与象限仪座流星雨.双子座流星雨被并称 ...
- html正则表达式确认密码,如何使用正则表达式在流星中验证确认密码
我使用meteor开发我的应用程序.我需要验证我的注册表单,以便限制用户.现在,我在我的注册表单中输入密码并确认密码.我正在使用正则表达式进行验证.如何使用正则表达式在流星中验证确认密码 我的代码是: ...
- 单片机流星灯_51单片机拖尾灯实现
这个拖尾灯,或者扫描灯,或者流星灯,不管怎么叫,原理上估计都是一样的.这玩意困扰了我好长的时间.我知道用PWM可以做出明暗效果.但是无法做到实现多路控制. 在网上有种叫"霹雳游侠扫描灯&qu ...
- 流星,刹那间划过天际
此文献给那些已经经历,正在经历或者还没有经历恋爱的人们. 流星,刹那间划过天际 --佛说:前生一百次回眸,换 ...
- 人造流星这种生日礼物,你有过吗?现在国外有了
全世界只有3.14 % 的人关注了 数据与算法之美 数据汪列举了不同"级别"的富豪是如何庆生的,大家看看自己处于什么水平. 三流土豪的孩子过生日,看的是蜡烛... 二流土豪的孩子过 ...
- 代码流星雨是什么形式_为什么要在2020年与流星合作
代码流星雨是什么形式 Meteor, an allegedly dead development platform, is still alive and can bring massive valu ...
- NOD32升级ID获取器For流星无语更新了
NOD32升级ID获取器For流星无语更新了一下,现在可以直接把用户名密码写入注册表了,连复制/粘贴操作都可以免了... 转载于:https://www.cnblogs.com/lxwy/archiv ...
- 魔兽争霸3地图(WarIII Maps):梦若流星
魔兽争霸3地图(WarIII Maps):梦若流星 梦若流星 游戏类型:RPG 通关时间:30分钟 流星蝴蝶剑后传, 即使孟星魂想独善其身, 也未必就能如愿------ 为了更好的体验游戏,请在在&q ...
最新文章
- P1064 金明的预算方案
- Ng-template寄宿方式
- IDEA连接Mysql报错: 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘. Change driver class
- Qt OpenGL 问题总结
- 单边指数信号的特点_测试技术课后题答案1信号描述
- POJ1151-Atlantis【线段树,扫描线,离散化】
- windows下python环境搭建_Win7怎么搭建Python环境 win7系统搭建Python环境的方法
- [Javascript]把html内容复制到剪贴板
- 【优化预测】基于matlab萤火虫算法优化BP神经网络预测【含Matlab源码 1313期】
- scrapy-cluster scrapy集群建设
- 大蟒蛇Python平台相关知识
- 全世界国家中英文名称以及地区区号json格式【资源】
- 创翼linux版本,创翼电信客户端for Mac-创翼客户端Mac版下载 V1.3.7-PC6苹果网
- 【清华大学陈渝】第五章 虚拟存储
- 隐藏在Windows XP中的28个秘密武器
- 手机显示服务器被重置连接断开,手机服务器链接被重置
- oracle 官网下载
- 网易云音乐、微博成新规后首批IPO企业 招股书披露数据安全风险
- 实时数据库数据采集接口API八爪鱼采集接口
- MySQL 精选 60 道笔试题
热门文章
- [原]Oracle外部表结合游标完成统计一例
- MySQL---分组查询
- 句句真研—每日长难句打卡Day13
- java8 自动关闭资源_java9系列第二篇-资源自动关闭的语法增强
- android 按钮点击动画效果_如何用纯css打造类materialUI的按钮点击动画并封装成react组件...
- 五千的手机和两三千的手机使用起来有什么不一样?有必要买贵的吗?
- 楼房顶顶面起渣是何原因?怎么修补?
- 年关将至,很多朋友想要创业的心又开始蠢蠢欲动了
- 为什么以前的电视一打雷就容易烧坏,现在的电视就不那么怕雷?
- 你们的苹果手机,关闭哪些功能比较省电?