Hướng dẫn giải của VM 08 Bài 09 - Những hình nhân nhảy múa
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
const fi=''; fo=''; maxn=100000; var n:longint; f:array[0..maxn] of longint; kt:boolean; procedure rf; var i,t:longint; begin assign(input,fi); reset(input); readln(n); f[0]:=0; kt:=true; for i:=1 to n do begin read(t); f[i]:=f[i-1]+t; if f[i]<=0 then kt:=false; if (i=n) or (i=1) then kt:=kt and (t>0); end; close(input); end; procedure sort(l,r:longint); var i,j,x,y:longint; begin i:=l; j:=r; x:=f[(i+j) div 2]; repeat while f[i]<x do inc(i); while f[j]>x do dec(j); if i<=j then begin y:=f[i]; f[i]:=f[j]; f[j]:=y; inc(i); dec(j); end; until i>j; if i<r then sort(i,r); if l<j then sort(l,j); end; procedure wf; var i:longint; begin assign(output,fo); rewrite(output); if kt then begin sort(1,n); for i:=1 to n do write(f[i]-f[i-1],' '); end else write(-1); close(output); end; begin rf; wf; end.
Code mẫu của happyboy99x
#include<cstdio> #include<algorithm> using namespace std; #define N 100000 int a[N+1], s[N+1], n; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%d", a+i); s[i] = s[i-1] + a[i]; } sort(s+1, s+n); for(int i = 1; i <= n; ++i) if((a[i] = s[i] - s[i-1]) <= 0) { printf("-1\n"); return 0; } for(int i = 1; i <= n; ++i) printf("%d ", a[i]); return 0; }
Code mẫu của ladpro98
program DANCING; uses math; const maxn=trunc(1e5+6); fi=''; var a:array[0..maxn] of longint; inp:text; n,i:longint; ok:boolean; procedure sort(l,r:longint); var p,t,i,j:longint; begin if l>=r then exit; i:=l;j:=r; p:=a[random(r-l+1)+l]; repeat while a[i]<p do inc(i); while a[j]>p 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; begin assign(inp,fi);reset(inp); readln(inp,n); for i:=1 to n do read(inp,a[i]); for i:=2 to n do inc(a[i],a[i-1]); sort(1,n-1);ok:=true; for i:=1 to n do if a[i]<=a[i-1] then begin ok:=false;break; end; if ok then for i:=1 to n do write(a[i]-a[i-1],' ') else write(-1); end.
Code mẫu của RR
{$R-,Q-} const FINP=''; FOUT=''; MAXN=100000; var n:longint; s,a:array[0..MAXN] of longint; procedure finish; var f:text; begin assign(f,FOUT); rewrite(f); writeln(f,-1); close(f); halt; end; procedure inp; inline; var f:text; i:longint; begin assign(f,FINP); reset(f); read(f,n); for i:=1 to n do read(f,a[i]); if (a[n]<0) or (a[1]<0) then finish; s[0]:=0; for i:=1 to n do s[i]:=s[i-1]+a[i]; close(f); end; procedure swap(var a,b:longint); inline; var temp:longint; begin temp:=a; a:=b; b:=temp; end; procedure sort(l,r:longint); inline; var i,j,mid:longint; begin i:=l; j:=r; mid:=s[l+random(r-l+1)]; repeat while s[i]<mid do inc(i); while s[j]>mid do dec(j); if i<=j then begin swap(s[i],s[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 ans; var f:text; i:longint; begin assign(f,FOUT); rewrite(f); for i:=1 to n do if s[i]-s[i-1]<0 then begin writeln(f,-1); close(f); halt; end; for i:=1 to n do write(f,s[i]-s[i-1],' '); close(f); end; begin inp; sort(1,n); ans; end.
Code mẫu của hieult
#include <stdio.h> main() { long a[100000],n,tong=0; int t,k=0; scanf("%ld",&n); for(long i=0;i<n;i++) { scanf("%ld",&a[i]); tong+=a[i]; } if(tong==0) printf("-1"); else { do { t=0; for(long i=1;i<n-1;i++) if(a[i]<0) { a[i-1]=a[i-1]+a[i]; a[i+1]=a[i]+a[i+1]; a[i]=-a[i]; t=1; } } while(t==1); for(long i=0;i<n;i++) if(a[i]<=0) k=1; if(k==0) for(long i=0;i<n;i++) printf("%ld ",a[i]); else printf("-1"); } }
Code mẫu của ll931110
{$MODE DELPHI} program DANCING; const input = ''; output = ''; maxn = 100000; var a,s: array[0..maxn + 1] of integer; n: integer; procedure init; var f: text; i: integer; begin assign(f, input); reset(f); readln(f, n); s[0] := 0; for i := 1 to n do begin read(f, a[i]); s[i] := s[i - 1] + a[i]; end; end; procedure swap(var x,y: integer); var z: integer; begin z := x; x := y; y := z; end; procedure qsort(l,h: integer); var i,j,p: integer; begin if l >= h then exit; i := l; j := h; p := s[random(h - l + 1) + l]; repeat while s[i] < p do inc(i); while s[j] > p do dec(j); if i <= j then begin if i < j then swap(s[i],s[j]); inc(i); dec(j); end; until i > j; qsort(l,j); qsort(i,h); end; procedure solve; var f: text; i: integer; begin assign(f, output); rewrite(f); if s[n - 1] >= s[n] then writeln(f, -1) else begin write(f, s[1], ' '); for i := 2 to n do write(f, s[i] - s[i - 1], ' '); end; close(f); end; begin init; qsort(1,n - 1); solve; end.
Bình luận