ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BZOJ1237: [SCOI2008]配对

2019-02-06 21:51:33  阅读:208  来源: 互联网

标签:ch get 整数 BZOJ1237 SCOI2008 include 配对 define


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

1 <= n <= 10^5,Ai和Bi均为1到10^6之间的整数。

从它匹配的状态入手,可以发现,一定是下面的情况:

更长的链一定可以拆成这几种情况,然后就很好做了,因为不管怎么拆,移动范围都只在2以内

然后DP就出来了

代码如下:

//MT_LI
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<vector> #include<ctime> #include<map> #include<bitset> #include<set> #define ll long long #define mp(x,y) make_pair(x,y) #define pll pair<long long,long long> #define pii pair<int,int> using namespace std; inline ll read() { ll f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int stack[20]; inline void write(int x) { if(x<0){putchar('-');x=-x;} if(!x){putchar('0');return;} int top=0; while(x)stack[++top]=x%10,x/=10; while(top)putchar(stack[top--]+'0'); } ll INF=1e18; inline void pr1(int x){write(x);putchar(' ');} inline void pr2(int x){write(x);putchar('\n');} int a[110000],b[110000]; ll f[110000]; ll get(int x,int y){return a[x]==b[y]?INF:abs(a[x]-b[y]);} int main() { int n=read(); for(int i=1;i<=n;i++)a[i]=read(),b[i]=read(); 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++) { if(i>=1) f[i]=min(f[i],f[i-1]+get(i,i)); if(i>=2) f[i]=min(f[i],f[i-2]+get(i,i-1)+get(i-1,i)); if(i>=3) { f[i]=min(f[i],f[i-3]+get(i,i-2)+get(i-1,i)+get(i-2,i-1)); f[i]=min(f[i],f[i-3]+get(i,i-1)+get(i-1,i-2)+get(i-2,i)); } } printf("%lld\n",f[n]); return 0; }

 

 

标签:ch,get,整数,BZOJ1237,SCOI2008,include,配对,define
来源: https://www.cnblogs.com/MT-LI/p/10354117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有