Editorial for Coins Game


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const fi='';
      fo='';
      maxn=1000000;
var n,x,y,max,i:longint;
    p:array[0..maxn+10] of boolean;
    a:array[1..200] of longint;

procedure rf;
begin
     assign(input,fi);
     reset(input);
     readln(x,y,n);
     max:=0;
     for i:=1 to n do
     begin
          read(a[i]);
          if a[i]>max then max:=a[i];
     end;
     close(input);
end;

procedure pr;
begin
     p[0]:=true; p[x]:=false; p[y]:=false;
     for i:=1 to x-1 do p[i]:=not p[i-1];
     for i:=x+1 to y-1 do p[i]:=not (p[i-1] or p[i-x]);
     for i:=y+1 to max do p[i]:=not (p[i-1] or p[i-x] or p[i-y]);
end;

procedure wf;
begin
     assign(output,fo);
     rewrite(output);
     for i:=1 to n do
         if p[a[i]] then write('B') else write('A');
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<int> vi;
typedef vector<vi> vvi;

#define sz(a) int((a).size())
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(c) (c).begin(), (c).end()
#define tr(c,i) for(typeof((c).begin()) i = (c).begin(), _e = (c).end(); i != _e; ++i)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#define rep(i,n) for(int i = 0, _n = (n); i < _n; ++i)
#define repd(i,n) for(int i = (n)-1; i >= 0; --i )
#define fo(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i)
#define fod(i,a,b) for(int i = (a), _b = (b); i >= _b; --i)

#define INF 1000000000
#define N 1000000

int k, l, m, n;
bool f[N+1];

int main() {
#ifndef ONLINE_JUDGE
    freopen( "input.txt", "r", stdin );
    //freopen( "output.txt", "w", stdout );
#endif
    scanf("%d%d%d",&k,&l,&m);
    f[0] = 0;
#define F(i) (i >= 0 ? f[i] : 1)
    fo(i,1,N) {
        f[i] = !F(i-1) || !F(i-k) || !F(i-l);
        /*f[i] = (F(i-2) && F(i-k-1) && F(i-l-1))
            || (F(i-k-1) && F(i-k-k) && F(i-k-l))
            || (F(i-l-1) && F(i-l-k) && F(i-l-l));*/
    }
    while(m--) {
        scanf("%d",&n);
        putchar( f[n] ? 'A' : 'B' );
    }
    putchar(10);
    return 0;
}

Code mẫu của ladpro98

program MCOINS;
uses    math;
const   maxn=1000006;
        fi='';
var     f:array[-1..maxn] of boolean;
        inp:text;
        k,l,m,lim,n,i,j:longint;
begin
        assign(inp,fi);reset(inp);
        readln(inp,k,l,m);
        lim:=0;
        f[0]:=true;
        for j:=1 to m do begin
                read(inp,n);
                if n>lim then begin
                        for i:=lim+1 to n do
                        if f[i-1] or f[max(i-k,-1)] or f[max(i-l,-1)] then
                        f[i]:=false
                        else f[i]:=true;
                        lim:=n;
                end;
                if f[n] then write('B')
                else write('A');
        end;
end.

Code mẫu của RR

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=1000001;
var
  f1,f2:text;
  f:array[0..MAXN] of longint;
  m,k,l:longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
procedure inp;
begin
  read(f1,k,l,m);
end;
procedure solve;
var
  i:longint;
begin
  f[0]:=0;
  for i:=1 to MAXN do
    begin
      if f[i-1]=0 then
        begin
          f[i]:=1;
          continue;
        end;
      if (i>=k) and (f[i-k]=0) then
        begin
          f[i]:=1;
          continue;
        end;
      if (i>=l) and (f[i-l]=0) then
        begin
          f[i]:=1;
          continue;
        end;
    end;
end;
procedure ans;
var
  i,u:longint;
begin
  for i:=1 to m do
  begin
    read(f1,u);
    if f[u]=1 then write(f2,'A')
    else write(f2,'B')
  end;
  writeln;
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
main()
{
char f[1000001];
long a,b,T,n;
scanf("%ld %ld %ld",&a,&b,&T);
f[1]='A';f[a]='A';f[b]='A';
for(long i=2;i<a;i++)
  {
  if(i%2==0)
    f[i]='B';
  else f[i]='A';
  }
for(long i=a+1;i<b;i++)
  {
  if(f[i-1]=='A'&&f[i-a]=='A')
  f[i]='B';
  else f[i]='A';
  }
for(long i=b+1;i<=1000000;i++)
  {
  if(f[i-1]=='A'&&f[i-a]=='A'&&f[i-b]=='A')
    f[i]='B';
  else f[i]='A';
  }
for(long i=1;i<=T;i++)
  {
  scanf("%ld",&n);
  printf("%c",f[n]);
  }
//getch();
}

Code mẫu của ll931110

Program MCOINS;
        Const
                input  = '';
                output = '';
        Var
                    F: array[-10..1000000] of boolean;
                    n: array[1..50] of longint;
                k,l,m: longint;

Procedure init;
          Var
                fi: text;
                 i: longint;
          Begin
                Assign(fi, input);
                        Reset(fi);
                        Readln(fi, k, l, m);
                        For i:= 1 to m do read(fi, n[i]);
                Close(fi);
          End;

Procedure optimize;
          Var
                i: longint;
          Begin
                For i:= -10 to -1 do F[i]:= true;
                F[0]:= false;

                For i:= 1 to 1000000 do
                        F[i]:= not F[i - 1] or not F[i - k] or not F[i - l];
          End;

Procedure solve;
          Var
                fo: text;
                 i: longint;
          Begin
                Assign(fo, output);
                        Rewrite(fo);
                        For i:= 1 to m do if F[n[i]] then write(fo, 'A') else write(fo, 'B');
                Close(fo);
          End;

Begin
        init;
        optimize;
        solve;
End.

Code mẫu của khuc_tuan

// {$APPTYPE CONSOLE}
 {$mode delphi}

var
    f : array[1..3] of integer;
    g : array[0..1000000] of boolean;
    ok : boolean;
    n, i, j : integer;
begin
    f[1] := 1;
    read( f[2], f[3], n);
    g[0] := true;
    for i:=1 to 1000000 do
    begin
        ok := false;
        for j:=1 to 3 do
            if (i >= f[j]) and (g[i-f[j]]) then
                ok := true;
        g[i] := not ok;
    end;
    for i:=1 to n do
    begin
        read(j);
        if g[j] then write('B')
        else write('A');
    end;
end.

Comments

Please read the guidelines before commenting.


There are no comments at the moment.