[SCOI2008]配对 (贪心,动态规划)
题目链接
Solution
很妙的DP,很妙的贪心.
首先考虑,如果说没有那个相同的不能配对的情况;
那么我们肯定是直接排两遍序,然后一一对应即可.
但是是有限制的,同时我们可得几个条件供贪心:
每个数字仅在 \(a\) 或 \(b\) 中出现一次. 即每个序列排序之后满足 \(a_i≠b_i\).
如果 \(a_i=b_i\) ,我们需要去和其他位置的元素交换;
我们交换的元素与当前元素的绝对距离不会大于 \(2\),也就是说每次我们碰到相同的情况,只需要 \(a_i\) 与 \(a_{i+1}\) 或者 \(a_{i-1}\) 交换.
然后我们定义 \(f[i]\) 为到第 \(i\) 个点的时候最小的差值.
考虑3个一组转移,至于为什么是3个,可以看上面的贪心条件.
令原排列为 \(a[i-2],a[i-1],a[i]\);
则有以下几种情况:
- \(a[i-2],a[i],a[i-1]\)
- \(a[i-1],a[i-2],a[i]\)
- \(a[i-1],a[i],a[i-2]\)
- \(a[i],a[i-2],a[i-1]\)
- \(a[i],a[i-1],a[i-2]\)
然后我们每次通过讨论从 \(f[i-3]\) 转移过来即可.
注意要预先处理 \(f[1],f[2],f[3]\) 的值.
Code
#include<bits/stdc++.h>
#define maxn 100005
#define ll long long
using namespace std;
const ll Inf=19260817;
ll f[maxn],n,a[maxn],b[maxn];
ll cal(int x,int y)
{
if (a[x]==b[y]) return Inf;
return abs(a[x]-b[y]);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for (int i=1;i<=n;i++) f[i]=Inf;
f[0]=0;
for (int i=1;i<=n;i++)
{
ll t=inf;
if (i>=1) t=min(t,f[i-1]+cal(i,i));
if (i>=2) t=min(t,f[i-2]+cal(i,i-1)+cal(i-1,i));
if (i>=3) t=min(t,f[i-3]+cal(i,i-1)+cal(i-1,i-2)+cal(i-2,i)),
t=min(t,f[i-3]+cal(i-2,i-1)+cal(i-1,i)+cal(i,i-2));
f[i]=t;
}
printf("%lld\n",f[n]);
}
[SCOI2008]配对 (贪心,动态规划)的更多相关文章
- B1237 [SCOI2008]配对 贪心 + dp
我刚开始,我打眼一看:哇!网络流大水题,直接费用流板子,建边跟zz一样.结果看了一眼数据范围...gg,luogu上只能得30,直接建边就是n^2,1e5根本过不了.咋办,只能另谋出路.想不出来,看题 ...
- bzoj 1237 [SCOI2008]配对 贪心+dp
思路:dp[ i ] 表示 排序后前 i 个元素匹配的最小值, 我们可以发现每个点和它匹配的点的距离不会超过2,这样就能转移啦. #include<bits/stdc++.h> #defi ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- bzoj千题计划179:bzoj1237: [SCOI2008]配对
http://www.lydsy.com/JudgeOnline/problem.php?id=1237 如果没有相同的数不能配对的限制 那就是排好序后 Σ abs(ai-bi) 相同的数不能配对 交 ...
- 【51Nod】1510 最小化序列 贪心+动态规划
[题目]1510 最小化序列 [题意]给定长度为n的数组A和数字k,要求重排列数组从而最小化: \[ans=\sum_{i=1}^{n-k}|A_i-A_{i+k}|\] 输出最小的ans,\(n \ ...
- 洛谷 P2507 [SCOI2008]配对
P2507 [SCOI2008]配对 题目背景 四川NOI2008省选 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值 ...
- nyoj 16-矩形嵌套(贪心 + 动态规划DP)
16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...
- 洛谷P2507 [SCOI2008]配对 [DP,贪心]
题目传送门 配对 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对.例如A={5,6 ...
- POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)
描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则 ...
随机推荐
- python_92_面向对象初体验
class dog: def __init__(self,name): self.name=name def bulk(self): print('%s汪汪汪!'%self.name) d1=dog( ...
- opensue "Have a lot of fun..."的出处
每次登陆opensuse都会出现“Have a lot of fun...”,觉得奇怪. 通过搜索发现在这是/etc/motd文件中配置的. MOTD(5) ...
- python之golbal/nonlocal
一.关键字 golbal nonlocal 在局部修改全局的变量为什么会报错 count = 0 def func(): count += 1 func() # UnboundLocalError: ...
- java的IO机制
BIO.NIO.AIO -----> Block-IO : inputStream 和OutputStream,Reader和Writer 1个连接,启动一个线程,这样导致很大的线程开销 NIO ...
- webservice基础
一.webservice概念 webservice用于异构平台之间的交互,我用Java写的程序,可以用php..net.pythod等其它语言的程序来访问我的接口.webservice有很多框架帮我们 ...
- Linux运维笔记--第二部
第2部-重要目录结构详解 1.回顾Linux目录结构知识 /dev/ 设备目录 /etc/ 系统配置及服务配置文件,启动命令的目录 /proc ...
- Linux运维笔记--第一部
CentOS 学习总结 ...
- MATLAB编程技巧
[摘要] MATLAB是一种科学计算语言,和C.Fortran等高级语言相类似,能方便的实现程序控制.以下介绍一点matlab编程的技巧. 嵌套计算 程序执行的速度取决于调用的子程序的个数和算法实现. ...
- Windows平台下使用vs code来调试python代码(2)
背景:上篇文章我们介绍了怎么搭建相关的环境,文章链接:https://www.cnblogs.com/yahuian/p/10507467.html,这篇文章来介绍怎么调试我们的程序. 1.Debug ...
- Helm入门
前言:Helm是GO语言编写的,是管理kubernetes集群中应用程序包的客户端工具.Helm是类似于centos上的yum工具或Ubuntu上的apt-get工具.对于应用发布者而言,可以通过He ...