题目链接:点击查看

题目大意:给出两种种类的数字分别 m1m_1m1​ 和 m2m_2m2​ 个,现在要求匹配 nnn 个不同种类的数字,每个数字只能使用一次,且两数之和不能超过 sss,输出任意两对数字之差最大值的最小值

题目分析:

首先二分答案将最值问题转换为检验问题。

假如差值确定后,每个数字就会出现一个可匹配的区间,设数字为 xxx,差值为 ddd,则其可以匹配另一种类的数字区间为 [x−d,min⁡(x+d,s−x)][x-d,\min(x+d,s-x)][x−d,min(x+d,s−x)]

于是转换为了区间和数字的最大匹配问题了:POJ - 3614 Sunscreen

用优先队列可以在 O(nlogn)O(nlogn)O(nlogn) 的复杂度内实现,加上二分,所以本题的复杂度为 O(nlog2n)O(nlog^2n)O(nlog2n)

代码:

// Problem: ICPC Camp
// Contest: Virtual Judge - Kattis
// URL: https://vjudge.net/problem/Kattis-icpccamp
// Memory Limit: 1048 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
struct Node {int l,r;bool operator<(const Node& t)const {return r>t.r;}
};
int a[N],b[N],n,m1,m2,s;
bool check(int d) {vector<Node>node;for(int i=1;i<=m2;i++) {int l=b[i]-d,r=min(b[i]+d,s-b[i]);node.push_back({l,r});}sort(node.begin(),node.end(),[&](Node a,Node b) {if(a.l!=b.l) {return a.l<b.l;}return a.r<b.r;});int cnt=0,pos=0;priority_queue<Node>q;//右端点大的区间优先级更高for(int i=1;i<=m1;i++) {while(pos<m2&&node[pos].l<=a[i]) {//将左端点小于等于a[i]的区间都压入优先队列候选q.push(node[pos]);pos++;}while(q.size()) {//右端点小于a[i]的区间后面肯定也用不到了,舍弃即可int r=q.top().r;q.pop();if(r>=a[i]) {cnt++;break;}}}return cnt>=n;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);read(n),read(m1),read(m2),read(s);for(int i=1;i<=m1;i++) {read(a[i]);}for(int i=1;i<=m2;i++) {read(b[i]);}sort(a+1,a+1+m1);int l=0,r=inf,ans=-1;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) {ans=mid;r=mid-1;} else {l=mid+1;}}cout<<ans<<endl;return 0;
}

Kattis - icpccamp ICPC Camp(二分+贪心)相关推荐

  1. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)

    CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...

  2. 洛谷P1182 数列分段 Section II(二分+贪心)

    题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N​,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...

  3. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest J. The Parade(二分+贪心)

    题目链接 大意:给你一个组士兵,告诉你身高iii的人数aia_iai​,让你放在kkk行,使得每行人数相同且每行中士兵身高差不超过111,问你最多能放多少士兵满足条件. 思路:二分每行人数.证明:如果 ...

  4. [USACO16JAN]Angry Cows S[二分+贪心]

    题意:Bessie 设计了一款新游戏:Angry Cows.在这个游戏中,玩家发射奶牛,每头奶牛落地时引爆一定范围内的干草.游戏的目标是使用一组奶牛引爆所有干草. N 捆干草排列在数轴上的不同位置.第 ...

  5. BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】

    题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...

  6. hdu5248序列变换(二分+贪心)基础题

    题意(中文的直接粘题意吧)                                                                                        ...

  7. 外卖(food) 洛谷4040宅男计划 三分套二分贪心

    food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久.     外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...

  8. LA 4254 Processor 处理器 【二分 贪心 优先队列】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663 二分: 最大值最小的问题通过二分来求解.对处理器速度进行 ...

  9. hdu 5248(二分+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5248 解题思路:这道题我原本的思路是动态规划,结果看到数很大,结果放弃了.然后想到二分,思路是对的,只 ...

最新文章

  1. c global 拦截 ajax,@RestControllerAdvice 全局拦截异常(示例代码)
  2. a55 matlab排列组合_matlab常用的排列组合
  3. php 客户端上传图片,php上传图片客户端和服务器端实现方法
  4. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...
  5. ssh本地端口转发,远程端口转发,隧道(这个解释不饶)
  6. 38动感菜单 38 jQuery And CSS Drop Down Multi Level Menu Solutions
  7. 数据建模-聚类分析-K-Means算法
  8. python的标志为什么是蛇_Python 为什么推荐蛇形命名法原因浅析
  9. UVA 11452 Dancing the Cheeky-Cheeky
  10. 2.2 获取图像感兴趣区域_超火的机器视觉OpenCVSharp学习笔记3——图像形态学处理...
  11. html组合标题,如何组合标题关键词(影响标题的5个因素)
  12. Android简易聊天室软件(HTTP实现)
  13. GMQ钱包积极打造并维护区块链健康生态的发展
  14. ligerui父页面向子页面传值
  15. 微信做音乐相册html5,js微信应用场景之微信音乐相册案例分享
  16. 在线TSV转CSV工具
  17. 一个站长找回域名的艰辛之路
  18. 如何ssh连接本地的虚拟机
  19. 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/06/28
  20. 武汉申报|市重点研发计划重点项目申报进行中

热门文章

  1. MySQL高级 - SQL优化 - limit优化
  2. 说一下 JVM 的主要组成部分?及其作用?
  3. Apollo配置中心原理简介
  4. springAop和AspectJ的关系
  5. NonfairSync.tryAcquire
  6. 反射_Class对象功能_获取Field
  7. POI文件导入:需求说明
  8. (常用API)正则表达式匹配练习
  9. flume案例-网络数据采集-Flume安装
  10. IO概述(概念分类)