Bzoj1237 [SCOI2008]配对

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1446  Solved: 551

Description

你有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是不允许的,因 为相同的数不许配对。

Input

第一行为一个正整数n,接下来是n 行,每行两个整数Ai和Bi,保证所有 Ai各不相同,Bi也各不相同。

Output

输出一个整数,即配对整数的差的绝对值之和的最小值。如果无法配对,输 出-1。

Sample Input

3
3 65
45 10
60 25

Sample Output

32

HINT

30%的数据满足:n <= 10^4 100%的数据满足:1 <= n <= 10^5,Ai和Bi均为1到106之间的整数。

Source

动态规划 线性DP 结论题

结论题,有趣。

如果没有匹配数不能相同的限制,分别将两数组排序,依次贪心匹配即可。

加上限制以后,匹配关系可能需要前后调整

由于a和b数组各自没有相同元素,可以脑洞出一个神奇的结论:调整的位置不会超过三位。

并不会证明。

于是直接推过去即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #define LL long long
 7 using namespace std;
 8 const int inf=1e9;
 9 const int mxn=100010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 inline int CP(int a,int b){return (a==b)?inf:abs(a-b);}
17 int n;
18 int a[mxn],b[mxn];
19 LL f[mxn];
20 int main(){
21 //    freopen("in.txt","r",stdin);
22     int i,j;
23     n=read();
24     for(i=1;i<=n;i++){
25         a[i]=read();b[i]=read();
26     }
27     sort(a+1,a+n+1);sort(b+1,b+n+1);
28     memset(f,0x3f,sizeof f);
29     f[0]=0;
30     f[1]=CP(a[1],b[1]);
31     f[2]=min(CP(a[1],b[1])+CP(a[2],b[2]),CP(a[1],b[2])+CP(a[2],b[1]));
32     for(i=3;i<=n;i++){
33         f[i]=min(f[i-1]+CP(a[i],b[i]),f[i-2]+CP(a[i-1],b[i])+CP(a[i],b[i-1]));
34         f[i]=min(f[i],f[i-3]+CP(a[i],b[i-1])+CP(a[i-1],b[i-2])+CP(a[i-2],b[i]));
35         f[i]=min(f[i],f[i-3]+CP(a[i],b[i-2])+CP(a[i-1],b[i-1])+CP(a[i-2],b[i]));
36         f[i]=min(f[i],f[i-3]+CP(a[i],b[i-2])+CP(a[i-1],b[i])+CP(a[i-2],b[i-1]));
37     }
38     if(f[n]>=0x3f3f3f3f3f3f3f)f[n]=-1;
39     printf("%lld\n",f[n]);
40     return 0;
41 }
时间: 2024-12-20 21:51:47

Bzoj1237 [SCOI2008]配对的相关文章

[SCOI2008]配对

题目描述 你有 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也各不相同. 输

[SCOI2008]配对 (贪心,动态规划)

题目链接 Solution 很妙的DP,很妙的贪心. 首先考虑,如果说没有那个相同的不能配对的情况; 那么我们肯定是直接排两遍序,然后一一对应即可. 但是是有限制的,同时我们可得几个条件供贪心: 每个数字仅在 \(a\) 或 \(b\) 中出现一次. 即每个序列排序之后满足 \(a_i≠b_i\). 如果 \(a_i=b_i\) ,我们需要去和其他位置的元素交换; 我们交换的元素与当前元素的绝对距离不会大于 \(2\),也就是说每次我们碰到相同的情况,只需要 \(a_i\) 与 \(a_{i+1

1237: [SCOI2008]配对

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1789  Solved: 715[Submit][Status][Discuss] Description 你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配 对.例如A={5,6,8},B={5,7,8},则最优配对方案是5配8, 6配5, 8配7,配对整数 的差的绝对值分别为2, 2, 1,和为

洛谷 P2507 [SCOI2008]配对

传送门 (讲道理)一道很简单的题,可惜我实在zz到了一种境界. 首先都可以匹配的情况下,两个数组分别排个序对应匹配肯定是最优的,实在太蠢的我不知道如何证明,就画了个丑陋的图. 可以发现不交叉一定不会更劣. 然后有一些是不能匹配的情况下,容易想到到肯定是跟它附近的几个交换.发现最多也不会跟它距离超过2的匹配,如图: 若是D和E匹配,一定不是最优. 考虑把三把叉中的一把拆掉,最坏情况下,A,B,C中的一个等于E,不能换,D等于另一个F,G,H中的一个,不能换,也就是两个交叉的可能都无法拆,但是是三个

BZOJ1076: [SCOI2008]奖励关

1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1669  Solved: 921[Submit][Status][Discuss] Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃).  宝物一共有n种,系统每次抛出这n种宝物的概率都相同且

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

1485 字符配对

codevs——1485 字符配对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 在一个字符串中,把相同的字符两两删除,求剩下字符的个数. 例如:字符串asasda, 首先删除两个'a',得到字符串'ssda'. 然后删除两个's',得到字符串'da'. 此时,字符串中没有了相同的字符,删除结束,剩下个数为2. 输入描述 Input Description 一个字符串,含义如描述所示. 输出描述 Output Des

Android蓝牙自动配对Demo,亲测好使!!!

蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details/52400782 经过最近一段时间得研究,针对网上给出的案例.总结了一个亲测好使的Demo. 说明如下: 1.本Demo用来连接蓝牙设备HC-05,如果你要连接其他蓝牙设备,注意修改相关名字以及修改设备初试pin值. 2.将Demo安装在Android手机上,点击按钮,可以实现与目标蓝牙设备的自动

【 网络流24 】飞行员配对方案问题

第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 2 名飞行员,其中 1 名是英国飞行员,另 1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员