Editorial for Những ngôi nhà
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.
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
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); }
Comments