假如不存在相等的两个数不能配对,那很容易贪心得到,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. 使用反射让Spinner选择同一选项时触发onItemSelected事件

    翻看源码,Spinner判断是否触发onItemSelected,是在它的基类AdapterView里面做的: void checkSelectionChanged() { if ((mSelecte ...

  2. #ifndef#define#endif的用法

    在网上看到了感觉作者总结得很好,作者辛苦了! #ifndef#define#endif的用法 文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都 ...

  3. jsp 页面实现增减行

    1.页面加入 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> < ...

  4. Object-C类目(Category)

    类目是Object-C中最有用的一个特性.实质上,类目允许你为一个已存在的类添加一些方法而不用子类化该类,也不需要你了解该类的实现细节. 这是特别有用的,因为你可以给一个内建的对象添加方法.当你想在你 ...

  5. ECMAScript6入门系列一

    let 命令 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 [注]:let与var相似,用来声明变量 ...

  6. io流之写文件

    用Java程序写文件有多种方式,对于不同类型的数据,有不同的写方法.写文件的关键技术点如下: 1.FileOutputStream打开文件输出流,通过write方法以字节为单位写文件,是写文件最通用的 ...

  7. iTerm 使用expect实现自动远程登录,登录跳板机

    #!/usr/bin/expect set timeout 10 spawn ssh -p [lindex $argv 0] [lindex $argv 1]@[lindex $argv 2] exp ...

  8. news总结

    上回的因为停网所以无法上传,被我保存成了一个我不会打开的东西,没法用了. news:新闻发布系统. 完成状态:差 个人理解度:一知半解 总结目的:秘密 直到现在,我对整个练习的知识点上的理解都不是很好 ...

  9. 网站开发常用jQuery插件总结(六)关键词说明插件cluetip

    我们开发的网站,总有它一定的用途.如企业站用来宣传企业或展示产品,技术站用来分享自己的思路和经验.既然网站有了它的用途,那么就拥有了它本身的关键词(关键词说明网站的主要内容).例如企业站的关键词大部分 ...

  10. 关于C# Winform 程序开机自动启动

    1.程序运行时调用下面方法即可. /// <summary> /// 设置开机自动启用 /// </summary> private void SetAutoStart() { ...