Hướng dẫn giải của Những ngôi nhà
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
var m,n:byte; dem:integer; b:array[1..100] of byte; a:array[0..25] of byte; procedure rf; var i,j:byte; begin readln(m,n); j:=0; for i:=1 to n do begin read(a[i]); j:=j+a[i]; end; a[0]:=m-j; m:=n+a[0]; if m=n then for i:=1 to n do b[i]:=i else begin b[1]:=1; for i:=2 to 1+a[0] do b[i]:=0; for j:=2 to n do b[a[0]+j]:=j; end; end; procedure writef; var i,j:byte; begin for i:=1 to m do if b[i]=0 then write(0,' ') else for j:=1 to a[b[i]] do write(b[i],' '); writeln; end; procedure swap(var a,b:byte); var t:byte; begin t:=a; a:=b; b:=t; end; procedure pr; var i,j,l,r:byte; begin dem:=0; repeat inc(dem); writef; if dem=1000 then halt; i:=m-1; while (i>0) and (b[i]>=b[i+1]) do dec(i); if i>0 then begin j:=m; while (j>i) and (b[j]<=b[i]) do dec(j); swap(b[i],b[j]); l:=i+1; r:=m; while l<r do begin swap(b[l],b[r]); dec(r); inc(l); end; end; until i=0; end; begin rf; pr; end.
Code mẫu của ladpro98
program houses; uses math; const maxN=22; maxL=111; fi=''; var a:array[0..maxn] of longint; f:array[1..maxL] of longint; check:array[1..maxN] of boolean; l,n,res,sum:longint; procedure input; var inp:text; i:longint; begin assign(inp,fi); reset(inp); readln(inp,l,n); for i:=1 to n do begin read(inp,a[i]); inc(sum,a[i]); end; a[0]:=1; close(inp); end; procedure output; var i,j:longint; begin i:=1; while i<=l do begin if f[i]<>0 then for j:=1 to a[f[i]] do write(f[i],' ') else write(f[i],' '); inc(i,a[f[i]]); end; writeln; end; procedure back(i,s:longint); var j:longint; begin if i>l then begin inc(res); if res>1000 then halt; output; exit; end; if (i>1) and ((sum-s)<=(l-i)) then begin f[i]:=0; back(i+1,s); end; for j:=1 to n do if not check[j] then begin check[j]:=true; f[i]:=j; back(i+a[j],s+a[j]); check[j]:=false; end; end; begin input; back(1,0); end.
Code mẫu của RR
//Written by Nguyen Thanh Trung {$R+,Q+} uses math; const FINP=''; FOUT=''; MAXN=100; var f1,f2:text; sum,n,l:longint; kq,len: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,l,n); sum:=0; for i:=1 to n do begin read(f1,len[i]); sum+=len[i]; end; kq[1]:=1; sum:=l-sum; for i:=sum+1 downto 2 do kq[i]:=0; for i:=2 to n do kq[sum+i]:=i; end; procedure print; var i,j:longint; begin for i:=1 to n do if kq[i]=0 then write(f2,'0 ') else for j:=1 to len[kq[i]] do write(f2,kq[i],' '); writeln(f2); end; procedure swap(var a,b:longint); var temp:longint; begin temp:=a; a:=b; b:=temp; end; procedure sort(l,r:longint); var i,j,mid:longint; begin i:=l; j:=r; mid:=kq[l+random(r-l+1)]; repeat while kq[i]<mid do inc(i); while kq[j]>mid do dec(j); if i<=j then begin swap(kq[i],kq[j]); inc(i); dec(j); end; until i>j; if i<r then sort(i,r); if l<j then sort(l,j); end; procedure solve; var count,i,vt,j,luu:longint; found:boolean; begin n+=sum; count:=0; repeat print; inc(count); if count=1000 then break; found:=false; for vt:=n-1 downto 1 do if kq[vt]<kq[vt+1] then break; if kq[vt]<kq[vt+1] then begin found:=true; luu:=vt+1; for j:=vt+2 to n do if (kq[j]>kq[vt]) and (kq[j]<kq[luu]) then luu:=j; swap(kq[vt],kq[luu]); if vt<n then sort(vt+1,n); end; until not found; end; begin openF; inp; solve; closeF; end.
Code mẫu của hieult
#include <stdio.h> #include <stdlib.h> //#include <conio.h> long l,n,spt,dem=0,a[21],d[101],m[101],i,j,tong; void thunhan() { long i,j; dem++; for(i=1;i<=spt;i++) { if(m[i]==0) printf("0 "); else for(j=1;j<=a[m[i]];j++) printf("%ld ",m[i]); } printf("\n"); if(dem==1000) exit(0); } void tim(long i,long x) { long j,k; for(j=0;j<=n;j++) { if(j==0) { if(i!=1) { if(spt-i>=x) { m[i]=0; if(i==spt) thunhan(); else tim(i+1,x); } } } else if(d[j]==0) { m[i]=j; d[j]=1; x=x-1; if(i==spt) thunhan(); else tim(i+1,x); x=x+1; d[j]=0; } } } main() { scanf("%ld %ld",&l,&n); for(i=1;i<=n;i++) { scanf("%ld",&a[i]); tong =tong+a[i]; } spt=l-tong+n; tim(1,n); //getch(); }
Code mẫu của ll931110
Program HOUSES; Const input = ''; output = ''; Var a: array[1..20] of integer; b: array[1..100] of integer; d: array[0..20] of boolean; l,n,request,count,s: integer; fi,fo: text; Procedure openfile; Begin Assign(fi, input); Reset(fi); Assign(fo, output); Rewrite(fo); End; Procedure init; Var i: integer; Begin Readln(fi, l, n); For i:= 1 to n do read(fi, a[i]); count:= 1; request:= n; s:= 0; For i:= 1 to n do s:= s + a[i]; Fillchar(d, sizeof(d), true); End; Procedure printresult; Var i: integer; Begin If b[1] <> 0 then Begin For i:= 1 to l do write(fo, b[i], ' '); Writeln(fo); inc(count); End; End; Procedure attempt(i: integer); Var j,k,t: integer; Begin If count = 1001 then exit; If i = 1 then t:= 1 else t:= 0; For k:= t to n do if d[k] then If k = 0 then Begin b[i]:= 0; If (i = l) and (request = 0) then printresult else if i <= l - s then attempt(i + 1); End else Begin If i + a[k] - 1 <= l then Begin For j:= i to i + a[k] - 1 do b[j]:= k; s:= s - a[k]; dec(request); d[k]:= false; if (i + a[k] - 1 = l) and (request = 0) then printresult else if i + a[k] - 1 <= l - s then attempt(i + a[k]); For j:= i to i + a[k] - 1 do b[j]:= 0; s:= s + a[k]; inc(request); d[k]:= true; End; End; End; Procedure closefile; Begin Close(fo); Close(fi); End; Begin openfile; init; attempt(1); closefile; End.
Code mẫu của skyvn97
#include<stdio.h> #define MAXN 30 #define MAXL 200 int l,n,sx,sum; int a[MAXN]; int x[MAXL]; int cnt; bool blt[MAXL]; bool p; void print(void) { int i; cnt++; if (!p) p=true; else printf("\n"); for (i=1;i<l;i=i+1) printf("%d ",x[i]); printf("%d",x[l]); } void btrk(int t) { if (cnt>=1000) return; int i,j; for (i=0;i<=n;i=i+1) { x[t]=i; if (x[1]!=0) { if (i==0) { if ((sum-sx)<=(l-t)) { if (t==l) print(); else btrk(t+1); } } else if (blt[i]) { blt[i]=false; for (j=t+1;j<a[i]+t;j=j+1) x[j]=i; sx=sx+a[i]; if (a[i]+t-1==l) print(); else btrk(a[i]+t); blt[i]=true; sx=sx-a[i]; } } } } int main(void) { cnt=0; int i; p=false; scanf("%d",&l); scanf("%d",&n); sum=0; sx=0; for (i=1;i<=n;i=i+1) { scanf("%d",&a[i]); sum=sum+a[i]; blt[i]=true; } btrk(1); }
Bình luận