jzoj. 100031. 【NOIP2017提高A组模拟7.9】外星密码

这里写图片描述

Input

共两行,第一行一个整数 n,第二行 n 个值为 0 或 1 的整数,表示矩阵的最后一列。

Output

输出文件共一行,为矩阵的第一行。

Sample Input

5
1 1 0 0 0

Sample Output

0 0 1 0 1

Data Constraint

对于 20%的测试数据n ≤ 20
对于 50%的测试数据 n≤ 1000
对于 100%的测试数据n ≤ 10000

Hint

这里写图片描述

分析:我们知道最后一列的数字,其实就是知道了一级密码的1和0的个数(这点应该知道吧)。显然每个数字在第一列也出现了一遍,因为是有序的,那就说明第一列其实钱x个是0,后n-x个是1(x为0的个数)。

接下来就有点神奇了:
对于每个第一列和最后一列,可以这样写成两列(样例):
0 1
0 1
0 0
1 0
1 0

显然,我们把0和1连线,就是第一列第一个0连接第二列第1个0,第一列第二个0连接第二列第二个0…………(以此类推,从上往下数,1同理)。

那答案是什么呢,我们先从第一列第一个数开始输出0,到了第三行(因为是第一列第一个数连接第二列第三个数),对应第一列的数字是0,再到第五行,对应第一列数字是1,到了第二行,对应数字是0,再到第四行,对应数字是1,显然,答案就是0 0 1 0 1

(至于为什么,我也不清楚,要听大神说了)

代码:

var
 n,i,x,y,s,r,t:longint;
 a,f:array [1..10001] of longint;
begin
 readln(n);
 for i:=1 to n do
  begin
   read(a[i]);
   if a[i]=0 then inc(x)
             else inc(y);
  end;
 s:=1; t:=x+1;
 for i:=1 to n do
  begin
   if a[i]=0 then begin f[s]:=i; inc(s); end
             else begin f[t]:=i; inc(t); end;
  end;
 r:=1;
 for i:=1 to n do
  begin
   write(a[f[r]],' ');
   r:=f[r];
  end;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值