假如不存在相等的两个数不能配对,那很容易贪心得到,A中rank 1匹配B中rank 1

A中rank2 匹配B中rank 2……

有了相等不能匹配这个条件,那么A中rank i可能和rank i,i-1,i+1匹配

也有可能三对数字交换匹配

dp一下就好了

 const inf=;
type node=array[..] of longint;
var a,b:node;
    f:array[..] of int64;
    n,i:longint; function min(a,b:int64):int64;
  begin
    if a>b then exit(b) else exit(a);
  end; function calc(a,b:longint):longint;
  begin
    if a=b then exit(inf)
    else exit(abs(a-b));
  end; procedure qsort(var a:node);
  procedure sort(l,r:longint);
    var i,j,x,y: longint;
    begin
      i:=l;
      j:=r;
      x:=a[(l+r) div ];
      repeat
        while a[i]<x do inc(i);
        while x<a[j] do dec(j);
        if not(i>j) then
        begin
          y:=a[i];
          a[i]:=a[j];
          a[j]:=y;
          inc(i);
          j:=j-;
        end;
      until i>j;
      if l<j then sort(l,j);
      if i<r then sort(i,r);
    end;   begin
    sort(,n);
  end; begin
  readln(n);
  for i:= to n do
    readln(a[i],b[i]);
  qsort(a);
  qsort(b);
  f[]:=calc(a[],b[]);
  f[]:=min(f[]+calc(a[],b[]),calc(a[],b[])+calc(a[],b[]));
  for i:= to n do
  begin
    f[i]:=f[i-]+calc(a[i],b[i]);
    f[i]:=min(f[i],f[i-]+calc(a[i-],b[i])+calc(a[i],b[i-]));
    f[i]:=min(f[i],f[i-]+calc(a[i],b[i-])+calc(a[i-],b[i])+calc(a[i-],b[i-]));
    f[i]:=min(f[i],f[i-]+calc(a[i],b[i-])+calc(a[i-],b[i-])+calc(a[i-],b[i]));
  end;
  if f[n]=inf then writeln(-) else writeln(f[n]);
end.

bzoj1237的更多相关文章

  1. 【BZOJ1237】配对(贪心,DP)

    题意:有n个a[i]和b[i],调整顺序使abs(a[i]-b[i])之和最小,但a[i]<>b[i].保证所有 Ai各不相同,Bi也各不相同. 30%的数据满足:n <= 104 ...

  2. BZOJ1237: [SCOI2008]配对

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1237 题目大意:你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 ...

  3. bzoj千题计划179:bzoj1237: [SCOI2008]配对

    http://www.lydsy.com/JudgeOnline/problem.php?id=1237 如果没有相同的数不能配对的限制 那就是排好序后 Σ abs(ai-bi) 相同的数不能配对 交 ...

随机推荐

  1. objective-c在Xcode中@property相关参数的解释

    objective-c在其对象拥有成员变量时,我们为了保持代码的封装,会将成员变量设置为@protected,并为成员变量编写setter和getter方法. 如: @interface Person ...

  2. linux 学习一

    linux 命令 ls -al ls -l cal

  3. 10.20_wiki

    XWiki:官网.Documentation.User's GuideProgrammer's GuideAdministrator's Guide Developer's Guide (1) htt ...

  4. cinder

    source /root/openrc 显示云硬盘: cinder list 这只是查看了admin租户下的,要查看所有租户下的云硬盘: cinder list --all-tenant 后台手动强行 ...

  5. STL:remove和erase区别

    C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢? vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的 ...

  6. linux - Mysql 创建用户和授权

    CREATE USER 'cui'@'%' IDENTIFIED BY 'xxxxxxxxxxxxxxxxxx'; GRANT ALL ON test_db.* TO 'cui'@'%'; REVOK ...

  7. 《APUE》第三章笔记(1)

    以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...

  8. @font-face

     /**  * jQuery.hhNewSilder 滚动图片插件  * User: huanhuan  * QQ: 651471385  * Email: th.wanghuan@gmail.com ...

  9. php计算最后一次,第一次字符串出现位置

    strpos($str, n) 首次,n在str第一次出现位置, strrpos($str, n) 最后一次,n在str最后一次出现位置 strripos区分大小写

  10. Razor引擎总结

    1.显示格式化小数:@(string.Format("{0:0.00}",ViewData["TradeAmount"].ToNullString()))