Hướng dẫn giải của Finding password


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

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

{$H}
const fi='';
      fo='';
      maxn=101;
type ar=array[1..maxn] of string;
var n,k,test,it,maxnum,num:longint;
    a,aa,b,d,dd,e,h:array[1..maxn] of longint;
    c,g:ar;
    f:array[0..maxn,0..maxn,0..9] of longint;
    kt:boolean;
    kq,temp:string;

procedure rf;
var i,j:longint;
    s:string;
begin
     read(n,k);
     for i:=1 to n do read(a[i]);
     for i:=1 to n-1 do
         for j:=i+1 to n do
             if a[i]>a[j] then
             begin
                  a[i]:=a[i]+a[j];
                  a[j]:=a[i]-a[j];
                  a[i]:=a[i]-a[j];
             end;
     for i:=1 to n do
     begin
          str(a[i],g[i]);
          d[i]:=length(g[i]);
          h[i]:=i;
     end;
end;

function min(x,y:longint):longint;
begin
     if x<y then min:=x else min:=y;
end;

function getmax(x,y:longint):longint;
begin
     if x>y then getmax:=x else getmax:=y;
end;

function comp(y,x:string):longint;
var i,lx,ly:longint; t:string;
begin
     lx:=length(x); ly:=length(y); comp:=0;
     while true do
     begin
          if lx<ly then
          begin
               t:=copy(y,1,min(lx,ly));
               delete(y,1,min(lx,ly));
               if t<x then exit(-1)
               else
               begin
                    if t>x then exit(1);
               end;
               ly:=length(y);
               if ly=0 then exit;
          end
          else
          begin
               t:=copy(x,1,min(lx,ly));
               delete(x,1,min(lx,ly));
               if y<t then exit(-1)
               else
               begin
                    if y>t then exit(1);
               end;
               lx:=length(x);
               if lx=0 then exit;
          end;
     end;
end;

procedure sort3(l,r:longint);
var i,j,y,t:longint; x,u:string;
begin
     i:=l; j:=r; x:=g[(i+j) shr 1]; y:=h[(i+j) shr 1];
     repeat
           while (comp(g[i],x)=-1) or ((comp(g[i],x)=0) and (h[i]<y)) do inc(i);
           while (comp(g[j],x)=1) or ((comp(g[j],x)=0) and (h[j]>y)) do dec(j);
           if i<=j then
           begin
                u:=g[i]; g[i]:=g[j]; g[j]:=u;
                t:=h[i]; h[i]:=h[j]; h[j]:=t;
                inc(i); dec(j);
           end;
     until i>j;
     if i<r then sort3(i,r);
     if l<j then sort3(l,j);
end;

procedure trace;
var dem,i,max,j:longint;
begin
     fillchar(b,sizeof(b),0);
     dem:=k;
     kt:=false; max:=1;
     num:=0;
     for i:=n downto k do
         if f[i,k,0]>max then
         begin
              num:=1; e[num]:=i;
              max:=f[i,k,0];
              kt:=true;
         end
         else
         begin
              if f[i,k,0]=max then
              begin
                   inc(num); e[num]:=i;
              end;
         end;
     if not kt then exit;
     kq:=''; j:=0;
     i:=e[1];
     repeat
           if f[i,dem,j]-d[i]=f[i-1,dem-1,(j+9-a[i] mod 9) mod 9] then
           begin
                dec(dem);
                j:=(j+9-a[i] mod 9) mod 9;
                if (dem=0) and (j<>0) then
                begin
                     inc(dem);
                     j:=(j+a[i]) mod 9;
                end
                else b[k-dem]:=a[i];
           end;
           dec(i);
     until dem=0;
     for i:=1 to k do write(b[i]);
end;

procedure pr;
var i,j,p,q:longint;
begin
     fillchar(f,sizeof(f),false);
     f[0,0,0]:=1;
     for i:=1 to n do
         for j:=0 to min(i,k) do
                 for q:=0 to 9 do
                 begin
                      f[i,j,q]:=f[i-1,j,q];
                      if j>0 then
                      begin
                           p:=f[i-1,j-1,(q+9-a[i] mod 9) mod 9];
                           if p>0 then f[i,j,q]:=getmax(f[i,j,q],p+d[i]);
                      end;
                 end;
end;

procedure edit;
var i:longint;
begin
     sort3(1,n);
     aa:=a; dd:=d;
     for i:=1 to n do
     begin
          a[i]:=aa[h[i]];
          d[i]:=dd[h[i]];
     end;
end;

procedure wf;
var i:longint;
begin
     if not kt then writeln(-1)
     else writeln(kq);
end;

begin
     assign(input,fi); reset(input);
     assign(output,fo); rewrite(output);
     read(test);
     for it:=1 to test do
     begin
          rf;
          edit;
          pr;
          trace;
          wf;
     end;
     close(input); close(output);
end.

Code mẫu của ladpro98

{$H+}
program FindingPassword;
uses    math,sysutils;
const   maxn=111;
        fi='';
var     a:array[1..maxn] of longint;
        str:array[1..maxn] of string;
        f:array[0..maxn,0..maxn,0..8] of string;
        exist:array[0..maxn,0..maxn,0..8] of boolean;
        inp:text;
        t,tt,n,k,i,j,r:longint;
        x,y,z:string;

procedure sort(l,r:longint);
var     i,j,t:longint;
        p:string;
begin
        if l>=r then exit;
        i:=l;j:=r;
        p:=IntToStr(a[random(r-l+1)+l]);
        repeat
                while IntToStr(a[i])+p>p+IntToStr(a[i]) do inc(i);
                while IntToStr(a[j])+p<p+IntToStr(a[j]) do dec(j);
                if i<=j then
                begin
                        if i<j then
                        begin
                                t:=a[i];
                                a[i]:=a[j];
                                a[j]:=t;
                        end;
                        inc(i);dec(j);
                end;
        until i>j;
        sort(l,j);sort(i,r);
end;

function comp(var a,b:string):boolean;
begin
        if length(a)<length(b) then exit(true);
        if length(a)>length(b) then exit(false);
        exit(a<b);
end;

begin
        assign(inp,fi);reset(inp);
        readln(inp,t);
        for i:=0 to maxn do exist[i,0,0]:=true;
        for tt:=1 to t do
        begin
                readln(inp,n,k);
                for i:=1 to n do readln(inp,a[i]);
                sort(1,n);
                for i:=1 to n do Str[i]:=IntToStr(a[i]);

                for i:=1 to n do
                for j:=1 to i do
                for r:=0 to 8 do
                begin
                        f[i,j,r]:='';
                        if exist[i-1,j-1,(9+r-a[i] mod 9) mod 9] then
                        f[i,j,r]:=f[i-1,j-1,(9+r-a[i] mod 9) mod 9]+Str[i];
                        if exist[i-1,j,r] and comp(f[i,j,r],f[i-1,j,r]) then f[i,j,r]:=f[i-1,j,r];
                        if exist[i,j-1,r] and comp(f[i,j,r],f[i,j-1,r]) then f[i,j,r]:=f[i,j-1,r];
                        if f[i,j,r]<>'' then exist[i,j,r]:=true
                        else exist[i,j,r]:=false;
                end;
                if not exist[n,k,r] then writeln(-1)
                else    writeln(f[n,k,0]);
        end;
end.

Code mẫu của RR

{$MODE OBJFPC}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       111;

var
  f1,f2         :       text;
  test,n,k      :       longint;
  f             :       array[1..MAXN,0..MAXN,0..8] of longint;
  a             :       array[1..MAXN] of 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;
    var
      i:longint;
    begin
      read(f1,n,k);
      for i:=1 to n do
        read(f1,a[i]);
    end;

var
  s1,s2:string[20];

function lower(a,b:longint):boolean;
    begin
      str(a,s1); str(b,s2);
      exit( s1+s1 < s2+s2 );
    end;

procedure init;
    var
      i,j,tmp:longint;
    begin
      fillchar(f,sizeof(f),$FF);
      for i:=1 to n-1 do
      for j:=i+1 to n do
        if lower(a[i],a[j]) then
          begin
            tmp:=a[i];
            a[i]:=a[j];
            a[j]:=tmp;
          end;
    end;

procedure solve;
    var
      i,c,next,du:longint;
      s:string[10];
    begin
      f[n+1,0,0]:=0;
      for i:=n downto 1 do
        begin
          //Ko chon a[i]
          for c:=0 to k do
          for next:=0 to 8 do
          if f[i+1,c,next]>=0 then
            f[i,c,next]:=f[i+1,c,next];

          //Chon a[i]
          str(a[i],s);
          f[i,1,a[i] mod 9]:=max(f[i,1,a[i] mod 9],length(s));
          for c:=0 to k-1 do
          for next:=0 to 8 do
          if f[i+1,c,next]>=0 then
            f[i,c+1,(next+a[i]) mod 9]:=max(f[i+1,c,next]+length(s),f[i,c+1,(next+a[i]) mod 9]);
        end;

      if f[1,k,0]<0 then begin writeln(f2,-1); exit; end;

      du:=0;
      for i:=1 to n do
        begin
          if k=0 then break;
          str(a[i],s);
          if f[i+1,k-1,(du+9-a[i] mod 9) mod 9]+length(s)=f[i,k,du] then
            begin
              write(f2,a[i]);
              dec(k); du:=(du+9-a[i] mod 9) mod 9;
            end;
        end;
      writeln(f2);
    end;

begin
  openF;
  read(f1,test);
  for test:=1 to test do
    begin
      inp;
      init;
      solve;
    end;
  closeF;
end.

Code mẫu của hieult

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000000001
#define maxn 111
#define oo 1111111111
#define base 100000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
double const PI=4*atan(1);

using namespace std;

typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;

int main ()
{
   // freopen("FP.in","r",stdin);
  int test,n,k,so,du;  
  string S[10][111],s[111],the1,the2,temp;
  scanf("%d",&test);
  for(int itest = 1;itest<=test;itest++){
       scanf("%d %d",&n,&k);
       for(int i = 1;i<=n;i++) cin>>s[i];
       for(int i = 1;i<=n;i++)
             for(int j = i+1;j<=n;j++){
                  the1 = s[i]+s[j];
                  the2 = s[j]+s[i];
                  if(the1.compare(the2)<0){
                        temp = s[i];
                        s[i] = s[j];
                        s[j] = temp;
                  }
             }
       //for(int i = 1;i<=n;i++) cout<<s[i]<<endl;
       for(int i = 0;i<9;i++) for(int j = 0;j<=n;j++) S[i][j]="";
       for(int i = 1;i<=n;i++){
             so = 0;
             for(int j = 0;j<s[i].length();j++)
                   so+=s[i][j]-'0';
             so%=9;
             for(int j = k;j>=2;j--){
                   for(int t = 0;t<9;t++){
                         if(S[t][j-1].compare("")!=0){
                               temp = S[t][j-1]+s[i];
                               du = (so+t)%9;
                               if((temp.length()>S[du][j].length())||((temp.length()==S[du][j].length())&&(temp.compare(S[du][j]))>0))
                                     S[du][j] = temp;
                         }
                   }
             }
             if((s[i].length()>S[so][1].length())||((s[i].length()==S[so][1].length())&&(s[i].compare(S[so][1]))>0)){
                  S[so][1] = s[i];
             }

       }
       if(S[0][k].compare("")==0)
             printf("-1\n");
       else cout<<S[0][k]<<endl;
  }
  //getch();
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.