模拟赛 红蓝牌

来源:互联网 发布:怎么屏蔽网络监控 编辑:程序博客网 时间:2024/04/28 19:30
题目:
    明明有N张牌,正面按编号写有数字1到N(每个数字只出现一次)。每张牌的反面根据正面的数字涂上两种颜色。如果正面的数字是质数,则为红色,反之为蓝色。 
明明的老师从这N张牌里选出了一些,按数字从小到大排序后全部反面向上放成一行。他要明明判断这些牌上的数字。


输入格式

    第一行:一个正整数N, 1 <= N <= 1000.  
    第二行:一个字符串,长度 K 在 1 到 50 之间。字符串中只有'R'和'B','R'表示红色,'B'表示蓝色。

输出格式:
    一行,有K个整数,每个整数代表相应位置上的牌的正面数字。如果某张牌不能确定上面的数字,否则输出-1.
输入样例:
样例1
5
RRR
样例2
7
BBB
样例3
6
RBR

输出样例:
样例1
2  3  5
样例2
1  4  6
样例3

-1  4  5


解题思路:

    正的反的做一遍,若某一张牌的两个值不同,则为-1.


代码:

var
  n,m,num,i,j,k,t,z,ii,jj:longint;
  a,b,s:array[0..2000]of longint;
  st:ansistring;
  c:char;
  f:array[0..2000]of boolean;


procedure csh(x:longint);
var
  i,j:longint;
begin
  for i:=2 to n do
    if f[i]=true then
    begin
      for j:=2 to n div i do
        f[i*j]:=false;
    end;
end;


begin
  fillchar(f,sizeof(f),true);
  f[1]:=false;
  readln(n);
  csh(n);
  readln(st);
  j:=0;
  for i:=1 to length(st) do
    begin
      inc(j);
      if st[i]='R' then
      begin
        if f[j]=true then
          a[i]:=j
        else begin
               while f[j]=false do
                 inc(j);
               a[i]:=j;
             end;
      end;
      if st[i]='B' then
      begin
        if f[j]=false then
          a[i]:=j
        else begin
               while f[j]=true do
                 inc(j);
               a[i]:=j;
             end;
      end;
    end;
  j:=n+1;
  for i:=length(st) downto 1 do
    begin
      dec(j);
      if st[i]='R' then
      begin
        if f[j]=true then
          b[i]:=j
        else begin
               while f[j]=false do
                 dec(j);
               b[i]:=j;
             end;
      end;
      if st[i]='B' then
      begin
        if f[j]=false then
          b[i]:=j
        else begin
               while f[j]=true do
                 dec(j);
               b[i]:=j;
             end;
      end;
    end;
  for i:=1 to length(st) do
    if a[i]<>b[i] then write('-1 ')
      else write(a[i],' ');
end.






0 0