红蓝牌

    xiaoxiao2021-03-25  52

    第1题 红蓝牌

    提交文件:rbcards.pas/cpp

    输入文件:rbcards.in

    输出文件:rbcards.out

     

    明明有N张牌,正面按编号写有数字1到N(每个数字只出现一次)。每张牌的反面根据正面的数字涂上两种颜色。如果正面的数字是质数,则为红色,反之为蓝色。

    明明的老师从这N张牌里选出了一些,按数字从小到大排序后全部反面向上放成一行。他要明明判断这些牌上的数字。

    输入格式:

    第一行:一个正整数N, 1 <= N <= 1000.

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

    输入文件(RBcards.in):

    第一行:一个正整数N, 1 <= N <= 1000.

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

     

    输出格式:

    一行,有K个整数,每个整数代表相应位置上的牌的正面数字。如果某张牌不能确定上面的数字,否则输出-1.

    输入输出样例:

    5

    RRR

    7

    BBB

    6

    RBR

    2  3  5

    1  4  6

    -1  4  5

     

    数据范围:

    对于10%数据 1 ≤n ≤ 20

    对于50%数据 1 ≤n ≤ 200

    对于所有数据 1 ≤ n ≤1000

    分析:

    暴力枚举牌的情况。

    代码:

    const   maxn=1000; var   flag,v:array [1..maxn] of boolean;   a:array [1..maxn] of longint;   n,m:longint;   s:string; procedure init; var   i,j:longint; begin   readln(n);   readln(s);   m:=length(s);   fillchar(flag,sizeof(flag),true);   flag[1]:=false;   for i:=2 to n do     if flag[i] then       for j:=2 to n div i do         flag[i*j]:=false;   j:=1; end; procedure main; var   i,j:longint; begin   for i:=1 to n do     if (s[j]='R') and (flag[i]) or (s[j]='B') and (flag[i]=false) then       begin         a[j]:=i;         inc(j);         if j>m then break;       end;   a[m+1]:=n+1;   fillchar(v,sizeof(v),true);   for i:=m downto 1 do     for j:=a[i]+1 to a[i+1]-1 do       if (s[i]='R') and (flag[j]) or (s[i]='B') and (flag[j]=false) then         begin           a[i]:=j;           v[i]:=false;         end;   for i:=1 to m do     if v[i] then       write(a[i],' ')     else       write(-1,' '); end; begin   assign(input,'rbcards.in');reset(input);   assign(output,'rbcards.out');rewrite(output);   init;   main;   close(input);close(output); end.

    转载请注明原文地址: https://ju.6miu.com/read-27660.html

    最新回复(0)