洛谷P2507 [SCOI2008]配对 [DP,贪心]
配对
题目描述
你有 n 个整数Ai和n 个整数Bi。你需要把它们配对,即每个Ai恰好对应一个Bp[i]。要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对。例如A={5,6,8},B={5,7,8},则最优配对方案是5ó8, 6ó5, 8ó7,配对整数的差的绝对值分别为2, 2, 1,和为5。注意,5ó5,6ó7,8ó8是不允许的,因为相同的数不许配对。
输入输出格式
输入格式:
第一行为一个正整数n,接下来是n 行,每行两个整数Ai和Bi,保证所有
Ai各不相同,Bi也各不相同。
输出格式:
输出一个整数,即配对整数的差的绝对值之和的最小值。如果无法配对,输
出-1。
输入输出样例
3
3 65
45 10
60 25
32
3
5 5
6 7
8 8
5
说明
30%的数据满足:n <= 10^4
100%的数据满足:1 <= n <= 10^5,Ai和Bi均为1到10^6之间的整数。
分析:
一开始打了个裸的贪心,然后30pts;然后看了five20巨佬写的正解,自己改,70pts;最后,开了long long,100pts。
如果没有那个$a[i]\neq b[i]$的要求,那么思路就很明显,直接贪心排序然后一一配对即可。
然后我们在观察一下,发现$a[i],b[i]$都是唯一的,那么就在这个贪心的基础上改一下,把相同的元素试着与周围的元素交换。分析可以得到,只有相邻的3对元素互相交换才能保证最优解。有了这个思路就好办了,可以把它转换成DP,并且在做的时候我们都不用特判,当$a[i]=b[i]$时直接赋值为$inf$即可。
Code:
//It is made by HolseLee on 25th July 2018
//Luogu.org P2507
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int N=1e5+;
const int inf=1e9+;
ll n,a[N],b[N],dp[N],ans; inline ll minu(ll x,ll y)
{
return x==y?inf:(x>y?x-y:y-x);
} inline ll Min(ll x,ll y)
{
return x>y?y:x;
} int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i]>>b[i];
sort(a+,a+n+);
sort(b+,b+n+);
if(n==&&a[]==b[]){
cout<<"-1"<<"\n";return ;
}
dp[]=minu(a[],b[]);
dp[]=Min(dp[]+minu(a[],b[]),minu(a[],b[])+minu(a[],b[]));
for(int i=;i<=n;i++){
dp[i]=dp[i-]+minu(a[i],b[i]);
dp[i]=Min(dp[i],dp[i-]+minu(a[i],b[i-])+minu(a[i-],b[i]));
dp[i]=Min(dp[i],dp[i-]+minu(a[i],b[i-])+minu(a[i-],b[i])+minu(a[i-],b[i-]));
dp[i]=Min(dp[i],dp[i-]+minu(a[i],b[i-])+minu(a[i-],b[i-])+minu(a[i-],b[i]));
dp[i]=Min(dp[i],dp[i-]+minu(a[i],b[i-])+minu(a[i-],b[i])+minu(a[i-],b[i-]));
}
cout<<dp[n]<<"\n";
return ;
}
洛谷P2507 [SCOI2008]配对 [DP,贪心]的更多相关文章
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P2507 [SCOI2008]配对
P2507 [SCOI2008]配对 题目背景 四川NOI2008省选 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值 ...
- 洛谷P2507 [SCOI2008]配对
题目背景 四川NOI2008省选 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对. ...
- 洛谷1417 烹调方案 dp 贪心
洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...
- 洛谷P1244 青蛙过河 DP/思路
又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...
随机推荐
- Ajax笔记-加强版
AJAX : Asynchronous JavaScript and XML 异步JavaScript和XML 用javascript异步形式去操作xml 进行数据交互 节省用户操作,时间 ...
- swiper.js的使用
点击api文档地址, (1)图片轮播banner <script src="js/jquery-2.1.4.min.js"></script> <sc ...
- Scrapy的安装--------Windows、linux、mac等操作平台
Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或者是Python3.3版本及以上.下面来说py3环境下,scrapy的安装过程. Scrapy依赖的库比较多,至少需 ...
- JavaScrip入门笔记(二)
使用JS完成表格的隔行换色 新标签的学习 <thead> <tr> <th></th> </tr> </thead> <t ...
- 【转】ubuntu 11.04使用apt-get安装软件时一直提示E:unable to locate package
问题: VMware虚拟机安装了ubuntu 11.04,在使用apt-get安装软件时一直提示E:Unable to locate package. 百度了原因,说是要更新源,使用命令:sudo a ...
- jQuery经典面试题及答案精选[转]
这两天有个面试,把这些记在这里. 问题:jQuery的美元符号$有什么作用? 回答:其实美元符号$只是”jQuery”的别名,它是jQuery的选择器,如下代码: $(document).ready( ...
- sql统计字符串出现次数技巧
在牛客网上看到一道题,感觉挺有趣,是用sql统计字符串出现的次数. 这里提供一种思路,比如统计字符串A中子串B的出现次数: SELECT (LENGTH(A) - LENGTH(REPLACE(A, ...
- PHP非常好用的分页类
分页类: <?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记 ...
- WordPress友情链接插件的安装
插件:link manager 这样就安装成功! 在外观小工具里 把右边即可 这样在前台页面上就可看见添加的友情链接了!!!
- MongoDB之数据库命令操作(二)
现在详细学习一下mongodb的数据库操作. 查询语句 db.xxx(集合name).find() # 查询 db.xxx(集合name).findOne() # 只返回一个 db.xxx(集合nam ...