{
ID:tsnoi201
PROG:fence8
LANG:PASCAL
}
program fence8;
var i,j,m,n,ans:longint;
board,sb:array[0..51] of longint;
rail,sr:array[0..1024] of longint;
pd:boolean;
procedure swap(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
procedure dfs(x,order:longint);
var g:longint;
begin
if x=1 then
begin
for g:=1 to m do if board[g]>=rail[x] then
begin
pd:=true;exit;
end;
exit;
end;
if pd then exit;
for g:=order to m do
if (board[g]<>board[g-1])and(board[g]=rail[x]) then
begin
dec(board[g],rail[x]);
if rail[x-1]=rail[x] then dfs(x-1,g) else dfs(x-1,1);
inc(board[g],rail[x]);
exit;
end;
for g:=order to m do
if (board[g]<>board[g-1])and(board[g]>=rail[x]) then
begin
dec(board[g],rail[x]);
if rail[x-1]=rail[x] then dfs(x-1,g) else dfs(x-1,1);
inc(board[g],rail[x]);
end;
end;
procedure twocut(l,r:longint);
var g:longint;
begin
if l>r then exit;
g:=(l+r) shr 1;
pd:=false;
dfs(g,1);
if pd then
begin
ans:=g;
twocut(g+1,r);
end else twocut(l,g-1);
end;
begin
assign(input,'fence8.in');
reset(input);
assign(output,'fence8.out');
rewrite(output);
read(m);
for i:=1 to m do read(board[i]);
for i:=1 to m-1 do
for j:=i+1 to m do
if board[i]>board[j] then
swap(board[i],board[j]); //提供的木板升序
read(n);
for i:=1 to n do read(rail[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if rail[i]>rail[j] then swap(rail[i],rail[j]); //需要的木板降序
fillchar(sb,sizeof(sb),0);
fillchar(sr,sizeof(sr),0);
for i:=1 to m do sb[i]:=sb[i-1]+board[i];
for i:=1 to n do sr[i]:=sr[i-1]+rail[i];
while sr[n]>sb[m] do dec(n);
twocut(1,n);
writeln(ans);
close(output);
end.
ID:tsnoi201
PROG:fence8
LANG:PASCAL
}
program fence8;
var i,j,m,n,ans:longint;
board,sb:array[0..51] of longint;
rail,sr:array[0..1024] of longint;
pd:boolean;
procedure swap(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
procedure dfs(x,order:longint);
var g:longint;
begin
if x=1 then
begin
for g:=1 to m do if board[g]>=rail[x] then
begin
pd:=true;exit;
end;
exit;
end;
if pd then exit;
for g:=order to m do
if (board[g]<>board[g-1])and(board[g]=rail[x]) then
begin
dec(board[g],rail[x]);
if rail[x-1]=rail[x] then dfs(x-1,g) else dfs(x-1,1);
inc(board[g],rail[x]);
exit;
end;
for g:=order to m do
if (board[g]<>board[g-1])and(board[g]>=rail[x]) then
begin
dec(board[g],rail[x]);
if rail[x-1]=rail[x] then dfs(x-1,g) else dfs(x-1,1);
inc(board[g],rail[x]);
end;
end;
procedure twocut(l,r:longint);
var g:longint;
begin
if l>r then exit;
g:=(l+r) shr 1;
pd:=false;
dfs(g,1);
if pd then
begin
ans:=g;
twocut(g+1,r);
end else twocut(l,g-1);
end;
begin
assign(input,'fence8.in');
reset(input);
assign(output,'fence8.out');
rewrite(output);
read(m);
for i:=1 to m do read(board[i]);
for i:=1 to m-1 do
for j:=i+1 to m do
if board[i]>board[j] then
swap(board[i],board[j]); //提供的木板升序
read(n);
for i:=1 to n do read(rail[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if rail[i]>rail[j] then swap(rail[i],rail[j]); //需要的木板降序
fillchar(sb,sizeof(sb),0);
fillchar(sr,sizeof(sr),0);
for i:=1 to m do sb[i]:=sb[i-1]+board[i];
for i:=1 to n do sr[i]:=sr[i-1]+rail[i];
while sr[n]>sb[m] do dec(n);
twocut(1,n);
writeln(ans);
close(output);
end.