uva1398 - Meteor

来源:互联网 发布:淘宝扒皮精灵家 编辑:程序博客网 时间:2024/06/06 10:55

题意:

n个流星,二维,给定初始坐标和速度,及一个坐标(0,0)到(w,h)的矩形。有个望远镜要拍摄,问能够同时在望远镜中拍摄到的最大的流星数目为多少?

思路:

要想所有流星在矩形里同时出现的数目最多,那么确定流星在矩形里出现的时段最重要,如果求得每科流星在矩形里出现的时间区间,那么让其时间区间排序后扫描一下,保留最大流星个数即可。

求时间区间时可将速度分为x,y方向的两个量分量分开求,进入时间的话要x,y两个分量都进入矩形才算,出来时间恰恰相反。

代码:


#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;struct Event{double t;int type;bool operator <(const Event & e)const{return t<e.t || (t == e.t && type > e.type);}} even[100005 * 2];void update(int x, int a, int w, double &l, double & r){if (a == 0){if (x <= 0 || x >= w) r = l - 1;// no ans}else if (a>0)//正方向{l = max(l, -(double)x / a);r = min(r, (double)(w - x) / a);}else{l = max(l, (double)(w - x) / a);r = min(r, -(double)x / a);}}int main(){int cas; scanf("%d", &cas);while (cas--){int w, h, n, num = 0, x, y, a, b;scanf("%d %d %d", &w, &h, &n);for (int i = 0; i<n; ++i){scanf("%d %d %d %d", &x, &y, &a, &b);double L = 0, R = 1e9;update(x, a, w, L, R);update(y, b, h, L, R);if (R>L){even[num++] = (Event){ L, 0 };even[num++] = (Event){ R, 1 };}}sort(even, even + num);int ans = 0, cnt = 0;for (int i = 0; i<num; ++i){if (even[i].type == 0) ans = max(ans, ++cnt);else cnt--;}printf("%d\n", ans);}return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没赶上高铁票怎么办 转火车晚点怎么办 卧铺 火车晚点换乘迟到怎么办 12306抢不到票怎么办 演唱会抢不到票怎么办 沈阳地铁月票卡怎么办 怀孕不上班保险怎么办 学生票取不了票怎么办 高铁票没余票了怎么办 买了票没赶上车怎么办 火车晚点未定该怎么办? 火车票买错了怎么办 12306被注册了怎么办 注册12306没有邮箱怎么办 火车退票不能退怎么办 火车票订单返库怎么办 网购火车票丢失怎么办 学生票超过优惠区间怎么办 异地恋不肯见面怎么办 小学学生证丢了怎么办 如果学生证丢了怎么办 学生票学生证丢了怎么办 毕业学生证丢了怎么办 四级学生证没有怎么办 高中学生证丢了怎么办 旅游学生证忘了怎么办 学生票买错了怎么办 四级没有学生证怎么办? 学生证取不了票怎么办 学生票区间超了怎么办 学生票不在乘车区间怎么办 学生证用了四次怎么办 误买了学生票怎么办 学生证填错了怎么办 学生票优惠区间不符怎么办 学生票超出优惠区间怎么办 蓝色车票刷不了怎么办 医院磁卡丢了怎么办 小区磁卡丢了怎么办 坐火车耳朵疼怎么办 下火车耳朵疼怎么办