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.
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