博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1237 配对(DP)
阅读量:6938 次
发布时间:2019-06-27

本文共 954 字,大约阅读时间需要 3 分钟。

题目链接:

题意:给出两个n元素的数列A和B。为A中的每个元素在B中为其找一个配对的元素(配对的元素不能相等,B中每个元素只能被使用一次),使得所有配对的两个数的差的绝对值之和最小?

思路:首先排序,若无配对元素不能相等这一 限制,则排序后一一匹配即可。有了这个限制,那么对于相等的元素就要在其前后进行调整,显然,与距离较远的调整不如与距离近的调整优。那么,需要在多大的 范围内调整才能保证最优呢?大牛给出的结论是最多在上下三个元素内调整即可。我不会证明。。不过,两个肯定是不行的,比如n=3,三个元素均对应相等,此 时必须要三个元素之间调整。那么,若4个连续元素对应相等呢?此时前两个调整后两个调整即可得到最优。因此用不着四个调整。这只是我粗糙的理解。这样的话 DP即可。f[i]表示前i个元素匹配完的最优值。

 

i64 f[N];int a[N],b[N],n;i64 C(int x){    if(x==0) return inf;    return abs(x);}int main(){    RD(n);    int i;    FOR1(i,n) RD(a[i],b[i]);    sort(a+1,a+n+1);     sort(b+1,b+n+1);    f[1]=C(a[1]-b[1]);    f[2]=min(f[1]+C(a[2]-b[2]),C(a[1]-b[2])+C(a[2]-b[1]));    for(i=3;i<=n;i++)    {        f[i]=f[i-1]+C(a[i]-b[i]);        f[i]=min(f[i],f[i-2]+C(a[i]-b[i-1])+C(a[i-1]-b[i]));        f[i]=min(f[i],f[i-3]+min(C(a[i]-b[i-1])+C(a[i-1]-b[i-2])+C(a[i-2]-b[i]),                                 C(a[i]-b[i-2])+C(a[i-1]-b[i])+C(a[i-2]-b[i-1])));    }      if(f[n]>=inf) puts("-1");    else PR(f[n]);}

 

 

 

转载地址:http://bdvjl.baihongyu.com/

你可能感兴趣的文章
深入path类
查看>>
final----这篇文章是我收获很大
查看>>
iOS 堆栈符号解析最佳实践
查看>>
Java集合源码分析(一)
查看>>
1027. Colors in Mars (20)
查看>>
1013. 数素数 (20)
查看>>
分享来自开源 Alice 样式库解决方案
查看>>
强大的JQuery选择器
查看>>
.Spring的事务管理
查看>>
异常 java.lang.RuntimeException: Error receiving broadcast Intent
查看>>
POJ-3252 Round Numbers 按位DP
查看>>
OpenCV的配置
查看>>
html基础学习02
查看>>
git commit之后撤销
查看>>
java web Excel下载导出功能
查看>>
机器学习术语
查看>>
0513PDO
查看>>
图像视觉方面优先的个人博客和研究所
查看>>
【HDU2007】平方和与立方和
查看>>
topcoder srm 470 div1
查看>>