今天因为 www.tyvj.cn 挂了,所以我就刷bzoj了,随便调了一个1234,反正最后各种原因,做了1237.
这道题一开始完全没思路,只是想到了排序一下,然后就不太知道了。
之后,我才发现:保证所有 Ai各不相同,Bi也各不相同。
这句话让我sb了好半天!比如,我在想这种数据怎么办:
N=10 A:1 1 1 1 1 2 4 6 8 10 B:1 1 1 1 1 3 5 7 9 11
多亏Oct_gap 201大神发现= - =。
这道题因为一组数中没有相同的,所以不用考虑上面那种恶心数据!
我们这么想:如果相同的也能选得话,就是排序一次,然后贪心即可。
但是这题,我们可以通过搜索第i项对应的[i-1] [i] 这是1对2
还有就是 i-1 i 对应i-2 i-1 i三项,
总共就有多个方程了,详细可以参见下面的code~(*^__^*) ~
还有
大家数组要开int64!
并且如果相等,不要返回maxlongint之类的,建议返回一个自己定的很大的值(我就这样wa了好几次)
type
arr=array[-10..100105] of int64;
var
fuck:int64;
n,i:longint;
a,b:arr;
f:array[-10..100105] of int64;
function min(a,b:int64):int64;
begin
if a<b then exit(a) else exit(b);
end;
function try(a,b:int64):int64;
begin
if a=b then exit(fuck);
exit(abs(a-b));
end;
procedure sort(var a:arr;l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
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-1;
end;
until i>j;
if l<j then
sort(a,l,j);
if i<r then
sort(a,i,r);
end;
begin
fuck:=9999999999999;
read(n);
for i:=1 to n do
read(a[i],b[i]);
sort(a,1,n);
sort(b,1,n);
f[1]:=try(a[1],b[1]);
f[2]:=min(f[1]+try(a[2],b[2]),try(a[1],b[2])+try(a[2],b[1]));
for i:=3 to n do
begin
f[i]:=f[i-1]+try(a[i],b[i]);
f[i]:=min(f[i],f[i-2]+try(a[i],b[i-1])+try(a[i-1],b[i]));
f[i]:=min(f[i],f[i-3]+try(a[i-2],b[i-1])+try(a[i-1],b[i])+try(a[i],b[i-2]));
f[i]:=min(f[i],f[i-3]+try(a[i-2],b[i])+try(a[i-1],b[i-2])+try(a[i],b[i-1]));
end;
if f[n]>=fuck then writeln(-1) else writeln(f[n]);
end.{啦啦啦Orz Oct_gap 201!}