uvalive3905Meteor

本文详细阐述了一个使用扫描线算法解决矩形照相机内流星捕捉问题的过程,通过分析流星的初始位置和速度,计算出在特定时刻能够捕捉到最多流星的解决方案。

题意:给你一个矩形照相机,还有n个流星的初始位置和速度,求能找到流星最多的时刻,注意,在相机边界上的点不会被照到。

\epsfbox{p3905.eps}

分析:相机的边界是固定的,只需要判断每一颗流星是否在照相机的区域内出现过,如果出现过,记录其出现的时间区间[ai,bi],那么问题转化为求一个时间t使得此时有最多的区间经过这个点,类似于“扫描线”

View Code
 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 #define DEBUG
 5 double max(double a, double b){
 6     return a>b?a:b;
 7 }
 8 double min(double a, double b){
 9     return a<b?a:b;
10 }
11 int max(int a, int b){
12     return a>b?a:b;
13 }
14 void update(int x, int a, int w, double& L, double& R){
15     if(a==0){
16         if(x<=0||x>=w) R=L-1;
17     }else if(a>0){
18         L = max(L, -x*1.0/a);
19         R = min(R, (w-x)*1.0/a);
20     }else{
21         L = max(L, (w-x)*1.0/a);
22         R = min(R, -x*1.0/a);
23     }
24 }
25 
26 const int MAXN = 100000 + 10;
27 
28 struct ZZ{
29     double x;
30     int type;        //0表示←,1表示→
31     bool operator < (const ZZ&z) const{
32         return x<z.x || (x==z.x && type>z.type);
33     }
34 };
35 ZZ zz[MAXN*2];
36 
37 int main(){
38 #ifndef DEBUG
39     freopen("in.txt", "r", stdin);
40 #endif
41     int cas;
42     scanf("%d", &cas);
43     while(cas--){
44         int w, h, n, e=0;
45         scanf("%d%d%d", &w, &h, &n);
46         int i;
47         for(i=0; i<n; i++){
48             int a, b, x, y;
49             scanf("%d%d%d%d", &x, &y, &a, &b);
50             double L = 0, R = 1e9;
51             update(x, a, w, L, R);
52             update(y, b, h, L, R);
53             if(R>L){
54                 ZZ tz;
55                 tz.x = L;
56                 tz.type = 0;
57                 zz[e++] = tz;
58                 tz.x = R;
59                 tz.type = 1;
60                 zz[e++] = tz;
61             }
62         }
63         sort(zz, zz+e);
64         int cnt=0, ans=0;
65         for(i=0; i<e; i++){
66             if(zz[i].type==0) ans=max(ans, ++cnt);
67             else cnt--;
68         }
69         printf("%d\n", ans);
70     }
71     return 0;
72 }

update()中当a>0时L=max(L, -x*1.0/a)包括了x取正和取负两种情况

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值