P7305 [COCI2018-2019#1] Cipele

[COCI2018-2019#1] Cipele

独立完成。

二分答案典题。

因为具有“最大值最小”这样明显的提示性词语,很容易想到二分答案,也就是二分丑陋度。

我们二分的丑陋度 xx,就是对于这个序列来说,他的丑陋度的最大值不可以超过这个 xx,看能不能成功。

我们先对这两个序列排序,然后对于 aia_i,找到第一符合条件的数 bjb_j,因为序列是有序的,后面的 aka_k 必然比现在的 aia_i 大,所以和 bjb_j 以前的数做差也一定不会符合条件。因为 aia_i 和他们做差已经不符合了,往后这个差值只会更大。所以下一次直接从 j+1j+1 开始寻找就好了,时间为 O(n)O(n)

最后注意我们默认要从数量少的那个序列在数量多的序列里面找。

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
int b[N],a[N],n,m;
bool check(int x){
	int p=1;
	for(int i=1;i<=n;i++){
		if(p>m)	return false;
		while(abs(a[i]-b[p])>x){
			if(i<n&&p>m)	return false;
			p++;
		}
		if(p>m)	return false;
		p++;
	}
	return true;
}
void Find(){
	int l=0,r=1e10;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid))	r=mid;
		else	l=mid+1;
	}
	cout<<r<<endl;
	return ;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)	cin>>a[i];
	for(int i=1;i<=m;i++)	cin>>b[i];
	if(n>m){
		for(int i=1;i<=n;i++)	swap(a[i],b[i]);
		swap(n,m);
	}
	sort(a+1,a+n+1),sort(b+1,b+m+1);
	Find();
	return 0;
}
posted @   June_Failure  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示