当前位置: 首页 > news >正文

上海高校金马五校赛 J - 小Y写文章

题目大意: 给你n个数字, 定义不连贯值为, max(abs(a[ i ] - b[ i ])) ,现在让你把m个新的数字插入n + 1 个空位中,使得不连贯值最小。

 

思路:二分不连贯值, 每次进行二分图匹配, 注意进行二分图匹配的时候需要加入虚拟的点,因为这n + 1个空位中有些点是必须加数字的。

  1 #include<bits/stdc++.h>
  2 #define LL long long
  3 #define fi first
  4 #define se second
  5 #define mk make_pair
  6 #define pii pair<int, int>
  7 using namespace std;
  8 
  9 const int N=400+7;
 10 const int M=100+7;
 11 const int inf=0x3f3f3f3f;
 12 const LL INF=0x3f3f3f3f3f3f3f3f;
 13 const int mod=1e9 + 9;
 14 
 15 int n, m, a[N], b[N],cx[N], cy[N], vis[N];
 16 vector<int> edge[N];
 17 
 18 bool path(int u)
 19 {
 20     for(int v : edge[u])
 21     {
 22         if(!vis[v])
 23         {
 24             vis[v] = 1;
 25             if(cy[v] == -1 || path(cy[v]))
 26             {
 27                 cx[u] = v;
 28                 cy[v] = u;
 29                 return true;
 30             }
 31         }
 32     }
 33     return false;
 34 }
 35 
 36 bool maxmatch()
 37 {
 38     int res=0;
 39     memset(cx, -1, sizeof(cx));
 40     memset(cy, -1, sizeof(cy));
 41     for(int i = 1; i <= 2 * n + 2; i++)
 42     {
 43         if(cx[i] == -1)
 44         {
 45             memset(vis, 0, sizeof(vis));
 46             if(path(i)) continue;
 47             else return false;
 48         }
 49     }
 50     return true;
 51  }
 52 
 53 bool check(int x) {
 54     for(int i = 1; i <= 2 * n + 2; i++)
 55         edge[i].clear();
 56     for(int i = 1; i <= n + 1; i++) {
 57         if(i == 1) {
 58             for(int j = 1; j <= m; j++) {
 59                 if(abs(b[j] - a[1]) <= x) {
 60                     edge[i].push_back(n + 1 + j);
 61                     edge[n + 1 + j].push_back(i);
 62                 }
 63             }
 64             for(int j = m + 1; j <= n + 1; j++) {
 65                 edge[i].push_back(n + 1 + j);
 66                 edge[n + 1 + j].push_back(i);
 67             }
 68         } else if(i == n + 1) {
 69             for(int j = 1; j <= m; j++) {
 70                 if(abs(b[j] - a[n]) <= x) {
 71                     edge[i].push_back(n + 1 + j);
 72                     edge[n + 1 + j].push_back(i);
 73                 }
 74             }
 75             for(int j = m + 1; j <= n + 1; j++) {
 76                 edge[i].push_back(n + 1 + j);
 77                 edge[n + 1 + j].push_back(i);
 78             }
 79         } else {
 80             for(int j = 1; j <= m; j++) {
 81                 if((abs(b[j] - a[i]) <= x) && abs(b[j] - a[i - 1]) <= x) {
 82                     edge[i].push_back(n + 1 + j);
 83                     edge[n + 1 + j].push_back(i);
 84                 }
 85             }
 86             if(abs(a[i] - a[i - 1]) <= x) {
 87                 for(int j = m + 1; j <= n + 1; j++) {
 88                     edge[i].push_back(n + 1 + j);
 89                     edge[n + 1 + j].push_back(i);
 90                 }
 91             }
 92         }
 93     }
 94     return maxmatch();
 95 }
 96 int main() {
 97     int T; scanf("%d", &T);
 98     while(T--) {
 99         scanf("%d%d", &n, &m);
100         for(int i = 1; i <= n; i++)
101             scanf("%d", &a[i]);
102         for(int i = 1; i <= m; i++)
103             scanf("%d", &b[i]);
104 
105         int l = 0, r = 1e9, ans = -1;
106 
107         while(l <= r) {
108             int mid = (l + r) >> 1;
109             if(check(mid)) {
110                 ans = mid;
111                 r = mid - 1;
112             } else {
113                 l = mid + 1;
114             }
115         }
116         printf("%d\n", ans);
117     }
118     return 0;
119 }
120 /***************
121 ****************/

 

转载于:https://www.cnblogs.com/CJLHY/p/8952586.html

相关文章:

  • C#求百分比
  • 用python写一个类似于linux中的tree
  • JS去掉字符串前后空格或去掉所有空格的用法
  • C#预处理器指令
  • find中的-exec参数
  • 再次解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException
  • 学习笔记——悬线法
  • 8.dockerfile之CMD指令
  • Mysql Programming CS 155P笔记(七) Dynamic SQL
  • JMS学习六(ActiveMQ消息传送模型)
  • linux常用命令:find 命令参数详解
  • MySQL Route负载均衡与读写分离Docker环境使用
  • linux 下 mysql-5.5.8 安装
  • 网络流24题~飞行员配对方案问题
  • vs code 插件收集
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2017-08-04 前端日报
  • echarts的各种常用效果展示
  • gcc介绍及安装
  • Java 内存分配及垃圾回收机制初探
  • java中的hashCode
  • leetcode388. Longest Absolute File Path
  • Mocha测试初探
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Redis中的lru算法实现
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring声明式事务管理之一:五大属性分析
  • SwizzleMethod 黑魔法
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue学习第二天
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 王永庆:技术创新改变教育未来
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 最近的计划
  • 《天龙八部3D》Unity技术方案揭秘
  • hi-nginx-1.3.4编译安装
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #android不同版本废弃api,新api。
  • #define,static,const,三种常量的区别
  • #includecmath
  • #pragma once与条件编译
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2022 CVPR) Unbiased Teacher v2
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .Mobi域名介绍
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net 受管制代码
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET国产化改造探索(一)、VMware安装银河麒麟