原题:
http://172.16.0.132/junior/#contest/show/1370/3
题目描述:
故事の背景:
俗话说的好,早睡早起方能养生,鸡腿终于结束了建小路的工程,他终于有时间出来玩啦,鸡腿决定来找你玩他刚发明的新式游戏
问题の描述:
鸡腿想到了一个很高(sha)明(bi)的游戏。给定一个N,然后写出两个长度为N*2的01串上下对应。每次呢鸡腿先走,他可以选择一列,如果上面那个是1他就得一分否则不得分。然后你走,你也选择一列,下面那个是1你就得一分否则不得分。选过的列不能再选,所有的列都被选了就结束了!最后谁得分最高谁获胜。
输入:
第一行两个整数N。
第2行和第3行,每行一个长度为2*N的01串。
输出:
一行一个字符串,如果鸡腿赢输出“First”,如果你赢输出“Second”,平局输出“Draw”。
样例输入:
样例输入1:
2
0111
0001
样例输入2:
3
110110
001001
样例输入3:
4
01100000
10010011
样例输出:
样例输出1:
First
样例输入2:
First
样例输出3:
Second
数据范围限制:
对于50%的数据:0 < N ≤ 5000;
100%的数据:0 < N ≤ 10^6。
分析:
从大到小排序,接着枚举判断;
实现:
var
n,i,t1,t2:longint;
s1,s2:ansistring;
procedure kp(x,y:longint);
var
i,j:longint;
mid,mid1,t:char;
begin
i:=x;
j:=y;
mid:=s1[x];
mid1:=s2[x];
repeat
while (s1[j]<mid)or(s1[j]=mid)and(s2[j]<mid1) do dec(j);
while (s1[i]>mid)or(s1[i]=mid)and(s2[i]>mid1) do inc(i);
if i<=j then
begin
t:=s1[i];
s1[i]:=s1[j];
s1[j]:=t;
t:=s2[i];
s2[i]:=s2[j];
s2[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if x<j then kp(x,j);
if i<y then kp(i,y);
end;
begin
assign(input,'game.in');reset(input);
assign(output,'game.out');rewrite(output);
readln(n); readln(s1); readln(s2);
kp(1,2*n);
for i:=1 to 2*n do
begin
if s1[i]='1' then
if s2[i]='1' then
if i mod 2=1 then inc(t1) else inc(t2)
else inc(t1)
else
if s2[i]='1' then inc(t2);
end;
if t1>t2 then writeln('First')
else
if t1<t2 then writeln('Second') else writeln('Draw');
close(input);close(output);
end.