二分答案——时隔三个月的再次

news/2025/1/30 21:23:55/文章来源:https://www.cnblogs.com/graspppp/p/18695385

暂且不提三个月未更新的主要原因(懒)

来自25年牛牛寒假营的一道寄巧题

image.png

part1

仔细考虑,显然满足单调性:假设时间T恰好发生第k次碰撞,那么T之前都不能发生,T之后只会越来越多

据此,又回到了上一篇的二分答案模板,但这里仍需考虑几个问题,如何简化问题?

对于高中物理,无需多言,对于质量相同的两个小球,只需要看作两个小球互相穿过即可,这样加上时间T,每个小球的始末状态都会确定,那么问题瞬间就清晰了许多,现在只需

要考虑两个小球是否发生碰撞。

image.png

//雨巨的ppt偷的图

part2

对于类似上述情况,从第一个球开始考虑,(根据相对运动)只需判断其经过时间2T(速度都为1)与下方第一个球的距离差是否小于X,如果小于则发生碰撞,类似,直到蓝色第

一个球与当前最后一个黄色能发生碰撞,从此开始考虑第二个球,显然,第二个球一定能与上一个蓝色球发生碰撞的黄色球前面的都发生碰撞(前提当前蓝色前面没有黄色小球)

由此,对于外层循环,内层循环一定不会后退到某个位置(且内层循环的遍历与外层有关),可以使用双指针进行求解.

image.png

part3

现在假设上面p1表示第一个在i右边的小球,p2表示能与当前小球碰撞的最后一个小球,对于每个p1,其要碰撞满足的条件一定是在i右边(当前小球为i),对于p2,则一直到最后

一个能与当前球碰撞的小球,v[p2] <= i + T;则最后碰撞次数res += p2-p1;

part4(细节问题)

由于上述问题仅考虑整形范围内,实际有可能两个球距离相聚为1,仅用0.5s,且此题要求精度,上述的时间T实际是*2之后的时间,所以在处理最后的结果时需要注意细节问题
    #include<bits/stdc++.h>
#define N 1005
#define mod 998244353
#define int long long
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f3f;
ll check(ll t,vector<ll> &q,vector<ll> &p)
{ll res = 0;ll p1 = 0,p2 = 0;for(auto &i : q){while(p1 < p.size() && p[p1] < i)   p1++;//p1记录i右边的第一个小球while(p2 < p.size() && p[p2] <= i + t)  p2++;//p2记录能与当前小球碰撞的最后一个小球res += p2-p1;}return res;
}
void solve()
{vector<ll> q1,q2;ll n,k;cin>>n>>k;//int ans = 0;for(int i = 0;i < n;i++){int q,p;cin>>q>>p;if(p == 1)  q1.push_back(q);else    q2.push_back(q);}sort(q1.begin(),q1.end());sort(q2.begin(),q2.end());//题目并未保证小球坐标升序排列int l = 0, r = INF,ans = 0;while(l <= r){int mid = (l+r)/2;if(check(mid,q1,q2) >= k){r = mid-1;}else{ans = mid;l = mid+1;}}//double ans1 = ans/2;//注意这里的ans实际上是两倍的Tif(ans == INF)  cout<<"No\n";else    {ans++;cout<<"Yes\n"<<ans/2;if(ans&1)   cout<<".500000";else    cout<<".000000";//printf("Yes\n%d.%c00000\n",ans/2,"05"[ans&1]);}
}
signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T = 1;while(T--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877170.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SWPUCTF 2021 新生赛]easyupload1.0 Writeup

1.发现是一个文件上传的题目,先上传一个一句话木马hack.jpg(因为题目前端有格式控制只能上传jpg文件)2.用burp抓包后修改后缀名为.php绕过过滤3.发包后显示:4:再用蚁剑进行连接(注意url,文件在/upload中上传),发现连接成功后找到flag.php但是发现这是个假flag(个人认为…

DeepSeek-R1环境搭建推理测试

​ 引子 这两天国货之光DeepSeek-R1火爆出圈,凑个热闹。过来看看 aha moment(顿悟时刻)的神奇,OK,我们开始吧。 一、模型介绍 1月20日,中国AI公司深度求索(DeepSeek)发布的DeepSeek-R1模型,凭借其独特的强化学习(RL)训练方法,首次让AI展现出类人的“顿悟时刻”——…

Centos7解决 pip is configured with locations that require TLS/SSL 问题

​ 当在 CentOS 系统中遇到 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available 错误时,这通常意味着 Python 的 SSL 模块没有正确安装或配置,从而导致pip无法使用安全连接来下载包。以下是解决此问题的详细步骤: …

突破自我,研发必须掌握的软技能!

0 你的问题,我知道! 光有硬技能远不够,很多研发硬技能不错,但发展有明显天花板。 影响研发职业发展走多远的核心能力有啥?技术只是打底和起步,长期职业发展看综合能力,各种软技能组合。研发常忽视或理解片面的能力: 1 沟通表达 1.1 啥是沟通表达? 不是口头“能说”,而…

小智带货助手【制作教程】增加音视频转换加贴纸等

根据用户反馈,【制作教程】在原有的功能基础之上,小智带货助手额外增加了:视频裁剪、音视频转换以及提取、音视频合并、图片转视频、音频截取、视频加贴纸等。便于直接对下载的素材进行二创修改。 截取音视频:begin为开始时间(毫秒),duration为要截取的时长(毫秒);注意单位…

昆明理工大学MBA25考研复试真题

--昆工MBA考研、管理与经济学院、125100工商管理、125602项目管理、199管理类综合能力、F009 政治、F008政治+项目管理概论

Windows server 2025 版本号 适用于 Windows Server 2025 的汇报

Windows server 2025 版本号 适用于 Windows Server 2025 的汇报 Windows Server 2025 是我们的年度频道中的最新版本。 在此页的左侧,你将找到针对此版本的 Windows Server 发布的所有更新的列表。 你还可以找到有关版本和任何已知问题的更多信息。 安装最新的更新可确保你还…

04. 用户管理

一、添加用户我们可以使用 adduser 命令 添加新用户。 sudo adduser 用户名二、更改用户密码创建完用户之后,我们还可以使用 passwd 命令 更改用户的密码。 sudo passwd 用户名三、查看用户信息我们还可以使用 id 命令 查看用户是否存在。 id 用户名如果我们想查看更多人的用户…

java中的HashSet与 == 和 equals的区别

什么是HashSet 在 Java 中,HashSet 是一个基于哈希表实现的集合类,它实现了 Set 接口 HashSet 的主要特点是:1,2 HashSet 的主要特点是 1,集合中的数据不能够重复 2,存储的数据是无序的(元素的存储顺序与插入顺序无关) 3,允许 null 值: 可以存储一个 null 元素(感觉这个不算)…

java中的HashSet

什么是HashSet 在 Java 中,HashSet 是一个基于哈希表实现的集合类,它实现了 Set 接口 HashSet 的主要特点是:1,2 HashSet 的主要特点是 1,集合中的数据不能够重复 2,存储的数据是无序的(元素的存储顺序与插入顺序无关) 3,允许 null 值: 可以存储一个 null 元素(感觉这个不算)…

记录本地部署自己的DeepSeek 大模型AI

准备工具Ollama:用于简化大型语言模型(LLM)的本地部署和使用,可以同时支持多个大模型,开发者能够方便地在本地环境中运行和测试不同的语言模型,简单的说就是相当于一个容器。官网地址:https://ollama.com/ChatBox AI:是一款用于接入各种大模型的客户端,使在大模型AI时…

CF999

A link首先,每次操作(第一次除外)之前\(s\)一定是一个奇数,那么我们要再加一个奇数才能让它变为偶数分数加一。 那么就是说操作过至少一次后,有几个奇数就有几分。 那么如果有至少一个偶数,那么第一次用偶数可以得分,后面再用奇数可以得分,偶数的不了分,最终得分就是奇…