洛谷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<< 这题的意思给的挺模糊,需要一定的 ...
随机推荐
- OpenCV---膨胀与腐蚀
膨胀 腐蚀 一:膨胀实现dilate import cv2 as cv import numpy as np def dilate_demo(image): #膨胀 print(image.shape ...
- WebApi连接数据库
首先在web.config中加上语句连接语句: <connectionStrings> <add name="conn" connectionString=&qu ...
- 如何在Lunix云服务器上安装Mysql进行远程连接
说说这个服务器上安装mysql真是一个大坑啊 ! 我也不知道自己怎么心血来潮就买一个百度云服务器,然后就想着吧自己做的一些小项目都跑上去.嘿嘿...其实就是想显摆下,写点小应用给不是编程的朋友们使用 ...
- UVA 10479 The Hendrie Sequence
https://vjudge.net/problem/UVA-10479 打表找规律: 1.根据n可以确定第n项在上表中第i行 2.减去前i-1行,就得到了n在第i行的第j个 3.第i行的规律:1个i ...
- Codeforces 807 A Is it rated?
http://codeforces.com/problemset/problem/807/A A. Is it rated? time limit per test 2 se ...
- errno错误号含义
errno0 : Success errno1 : Operation not permitted errno2 : No such file or directory errno3 : No suc ...
- marquee滚动效果
转载两篇文章: http://blog.sina.com.cn/s/blog_49ce67fc0100atb4.html https://baike.1688.com/doc/view-d359560 ...
- c语言学习笔记.数组.
数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...
- [网站安全] [实战分享]WEB漏洞挖掘的一些经验分享
WEB漏洞有很多种,比如SQL注入,比如XSS,比如文件包含,比如越权访问查看,比如目录遍历等等等等,漏洞带来的危害有很多,信息泄露,文件上传到GETSHELL,一直到内网渗透,这里我想分享的最主要的 ...
- phpmywind调用方法大全
头部文件调用 <?php require_once('header.php'); ?> 底部文件调用 <?php require_once('footer.php'); ?> ...