| | | | 描述 Description | | | 中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱? | | | |
| | | | 输入格式 Input Format | | | 第一行为一个正整数n (n <= 1000) ,表示双方马的数量。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。 | | | |
| | | | 输出格式 Output Format | | | 仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。 | | | |
| | | | 样例输入 Sample Input [复制数据] | | | 3 92 83 71 95 87 74
| | | |
| | | | 样例输出 Sample Output [复制数据] | | | 200 | | | |
| | | | 时间限制 Time Limitation | | | 各个测试点1s |
|
=================
=================
type
arr=array[1..1000]of longint;
var
n:longint;
a:array[1..1000]of longint;
b:array[1..1000]of longint;
f:array[0..1100,0..1100]of longint;
procedure init;
begin
assign(input,'p1048.in');
assign(output,'p1048.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure qsort(var a:arr;s,t:longint);
var
i,j:longint;
x,tem:longint;
begin
x:=a[(s+t)shr 1];
i:=s; j:=t;
repeat
while x>a[j] do dec(j);
while x<a[i] do inc(i);
if i<=j then
begin
tem:=a[i]; a[i]:=a[j]; a[j]:=tem;
inc(i); dec(j);
end;
until i>j;
if i<t then qsort(a,i,t);
if s<j then qsort(a,s,j);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure main;
var
i,j:longint;
ans:longint;
begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do read(b[i]);
qsort(a,1,n);
qsort(b,1,n);
for i:=0 to 1100 do
for j:=0 to 1100 do
f[i,j]:=-100000000;
f[1,1]:=0;
for i:=1 to n do
for j:=1 to n do
if f[i,j]<>-100000000 then
begin
if a[i]>b[j] then f[i+1,j+1]:=max(f[i+1,j+1],f[i,j]+200);
if a[i]=b[j] then
begin
f[i+1,j+1]:=max(f[i+1,j+1],f[i,j]);
f[i,j+1]:=max(f[i,j+1],f[i,j]-200);
end;
if a[i]<b[j] then f[i,j+1]:=max(f[i,j+1],f[i,j]-200);
end;
ans:=-maxlongint;
for i:=1 to n+1 do
begin
if ans<f[i,n+1] then ans:=f[i,n+1];
if ans<f[n+1,i] then ans:=f[n+1,i];
end;
writeln(ans);
end;
begin
init;
main;
terminate;
end.