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.

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

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.