「题解」:Kill
2024-09-05 13:53:38
问题 A: Kill
时间限制: 1 Sec 内存限制: 256 MB
题面
题面谢绝公开。
题解
80%算法
赛时并没有想到正解,而是选择了另一种正确性较对的贪心验证。
对于每一个怪,我们定义它的权值为到结算点的距离。
二分答案,对于每一个人,考虑他能打的所有怪,选择权值最大的怪去打。这样可以尽量将权值小的怪留给后面的人。
然而这样会挂掉。考虑假如结算点在中间,右边怪少人多,左边怪多人少,
而左边一个距离结算点比较近的人可能会抢掉右边一个怪,造成答案不优。
复杂度$O(nmlog)$
100%算法
正解二分加贪心验证。对人的位置和怪的位置分别排序。
二分最终答案。check的时候顺序扫每一个人,顺序打怪即可。可以保证每个人都有怪打。
复杂度$O(nlog)$
代码:
#include<bits/stdc++.h>
#define rint register int
#define ll long long
#define read(A) A=init()
using namespace std;
inline int init()
{
int a=,b=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')b=-;ch=getchar();}
while(ch>=''&&ch<=''){a=(a<<)+(a<<)+ch-'';ch=getchar();}
return a*b;
}
int n,m,s,ans=0x7fffffff;
int p[],q[],w[];
bool vis[];
inline ll get_dis(int x,int y)
{
return 1ll*abs(q[y]-p[x])+abs(q[y]-s);
}
inline bool check(ll mid)
{
int j=;
for(rint i=;i<=n;++i)
{
while(j<=m)
{
if(get_dis(i,j)<=mid){j++;break;}
j++;
}
if((j==m+)&&(i<n))
return false;
if((j==m+)&&(i==n)&&get_dis(n,m)>mid)
return false;
}
return true;
}
int main()
{
read(n),read(m),read(s);
for(rint i=;i<=n;++i)read(p[i]);
for(rint i=;i<=m;++i)read(q[i]);
ll l=,r=0x7fffffffffffffff;
sort(p+,p+n+);sort(q+,q+m+);
while(l<=r)
{
ll mid=(l+r)>>;
if(!check(mid))l=mid+;
else r=mid-;
}
printf("%lld\n",l);
return ;
}
最新文章
- DirectDraw创建Windows窗口
- MySQL学习记录--操作时间数据
- Java多线程系列--“基础篇”06之 线程让步
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
- NET中的规范标准注释(二) -- 创建帮助文档入门篇
- mORMot 数据库操作
- 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看
- win10 mysql详尽安装教程
- Jenkins +git +python 进行持续集成进行接口测试(接口测试jenkins持续集成篇)
- Myeclipse10破解版安装包
- 字符串转义为HTML
- Python序列的一点用法
- 445. Add Two Numbers II 链表中的数字求和
- 【SQL】小心在循环中声明变量——浅析SQL变量作用域
- 《全栈性能Jmeter》-2性能测试初体验
- php函数总结2
- ISCSI测试
- 完成向后台添加用户的ssm项目,完整版
- 使用JQuery插件Jcrop进行图片截取
- Mac 设置终端中使用 sublime 打开文件