Hướng dẫn giải của Rải sỏi


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 maxn=400;
var n:longint;
    s,f,b:array[1..maxn] of longint;
    a:array[1..maxn,1..maxn] of longint;

procedure rf;
var i,j:longint;
begin
     readln(n);
     while not eof do
     begin
          read(i,s[i]);
          for j:=1 to s[i] do read(a[i,j]);
          readln;
     end;
end;

procedure visit(x:longint);
var i,j,t:longint;
begin
     if s[x]=0 then
     begin
          f[x]:=1; exit;
     end;
     for i:=1 to s[x] do visit(a[x,i]);
     for i:=1 to s[x] do b[i]:=f[a[x,i]];
     for i:=1 to s[x]-1 do
         for j:=i+1 to s[x] do
             if b[i]<b[j] then
             begin
                  t:=b[i]; b[i]:=b[j]; b[j]:=t;
             end;
     f[x]:=b[1]; t:=b[1]-1;
     for i:=2 to s[x] do
         if t<=b[i] then
         begin
              f[x]:=f[x]+b[i]-t;
              t:=b[i]-1;
         end
         else dec(t);
end;

begin
     rf;
     visit(1);
     writeln(f[1]);
end.

Code mẫu của happyboy99x

#include<cstdio>
#include<queue>
#include<vector>
using namespace std;

#define TR(v,i) for(typeof((v).begin()) i=(v).begin();i!=(v).end();++i)
vector<vector<int> > c;

int dfs(int u) {
    if(c[u].size() == 0) return 1;
    priority_queue<int> q;
    TR(c[u], v) q.push(dfs(*v));
    int res = q.top(), now = res;
    for( ; !q.empty(); q.pop()) {
        while(now < q.top()) ++now, ++res;
        --now;
    }
    return res;
}

void enter() {
    int n; scanf("%d", &n);
    c.assign(n, vector<int>());
    for(int p, m; scanf("%d%d", &p, &m) == 2; ) {
        --p;
        for(int i = 0; i < m; ++i) {
            int u; scanf("%d", &u);
            c[p].push_back(--u);
        }
    }
}

int main() {
    enter();
    printf("%d\n", dfs(0));
    return 0;
}

Code mẫu của ladpro98

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
const int N = 500;
using namespace std;
int f[N], n;
vector<int> a[N];

int F(int u) {
    if (a[u].empty()) return 1;
    vector<int> v;
    for(int i = 0; i < a[u].size(); i++) v.push_back(F(a[u][i]));
    sort(v.begin(), v.end(), greater<int>());
    int res = 0;
    for(int i = 0; i < a[u].size(); i++) res = max(res, v[i] + i);
    return res;
}

int main()
{
    scanf("%d", &n);
    int i, u, v, sz;
    while (scanf("%d %d", &u, &sz) == 2){
        while (sz--) {
            scanf("%d", &v);
            a[u].push_back(v);
        }
    }
    cout << F(1);
    return 0;
}

Code mẫu của RR

PROGRAM STONE1;
CONST
  fi='';
  fo='';
  maxn=400;
TYPE
  lifo=^ds;
  ds=record data:integer; next:lifo; end;
  mang=array[1..maxn] of integer;
VAR
  n:integer;
  Ke:array[1..maxn] of lifo;
  sc,min:array[1..maxn] of integer;
Procedure Prepare;
Var
  i:integer;
Begin
  For i:=1 to n do sc[i]:=0;
  For i:=1 to n do
    begin
      New(ke[i]);
      Ke[i]:=nil;
    end;
End;
Procedure Add(u:integer;var k:lifo);
Var
  p:lifo;
Begin
  New(p); p^.data:=u; p^.next:=k; k:=p;
End;
Procedure ReadInput;
Var
  f:text;
  i,j,u,count:integer;
  xet:array[1..maxn] of boolean;
Begin
  Assign(f,fi); Reset(f);
  Readln(f,n);
  Prepare; count:=1;
  For i:=1 to n do xet[i]:=false;
  While not Eof(f) do
  begin
    Read(f,i);
    Read(f,sc[i]);
    For j:=1 to sc[i] do
      begin
        Read(f,u);
        Add(u,ke[i]);
        If not xet[u] then inc(count);
        xet[u]:=true;
      end;
    If count=n then exit;
  end;
  Close(f);
End;
Function max(a,b:integer):integer;
Begin
  If a>b then max:=a else max:=b;
End;
Procedure QuickSort(var a:mang;n:integer);
  Procedure Sort(l,r:integer);
  Var
    i,j:integer;
    tg,x:integer;
  Begin
    i:=l; j:=r; x:=a[(l+r) div 2];
    repeat
      While a[i]>x do inc(i);
      While a[j]<x do dec(j);
      If i<=j then
        begin
          tg:=a[i]; a[i]:=a[j]; a[j]:=tg;
          inc(i); dec(j);
        end;
    until i>j;
    If i<r then Sort(i,r);
    If l<j then Sort(l,j);
  End;
Begin
  Sort(1,n);
End;
Procedure Visit(u:integer);
Var
  p:lifo;
  dem:integer;
  a:mang;
Begin
  min[u]:=1;
  If sc[u]=0 then exit;
  p:=Ke[u]; dem:=0;
  While p<>nil do
  with p^ do
    begin
      Visit(data);
      inc(dem);
      a[dem]:=min[data];
      p:=next;
    end;
  QuickSort(a,sc[u]);
  For dem:=1 to sc[u] do
    If a[dem]+dem-1>min[u] then min[u]:=a[dem]+dem-1;
End;
Procedure WriteOutput;
Var
  f:text;
Begin
  Assign(f,fo); Rewrite(f);
  Writeln(f,min[1]);
  Close(f);
End;
BEGIN
  ReadInput;
  Visit(1);
  WriteOutput;
END.

Code mẫu của ll931110

program STONE1;
const
  input  = '';
  output = '';
  maxn = 400;
type
  pnode = ^tnode;
  tnode = record
    val: integer;
    link: pnode;
  end;
var
  a: array[1..maxn] of pnode;
  s,F,nchi: array[1..maxn] of integer;
  n: integer;

procedure addnode(u,v: integer);
var
  p: pnode;
begin
  new(p);
  p^.val := v;
  p^.link := a[u];
  a[u] := p;
end;

procedure init;
var
  fi: text;
  i,u,v,k,j: integer;
begin
  assign(fi, input);
    reset(fi);

  fillchar(nchi, sizeof(nchi), 0);
  fillchar(F, sizeof(F), 0);

  readln(fi, n);
  while not seekeof(fi) do
    begin
      read(fi, u, k);
      nchi[u] := k;

      for j := 1 to k do
        begin
          read(fi, v);
          addnode(u,v);
        end;
      readln(fi);
    end;

  close(fi);
end;

procedure DFS(u: integer);
var
  p: pnode;
  i,j,z,v,rem,cc: integer;
begin
  if nchi[u] = 0 then F[u] := 1 else
    begin
      p := a[u];
      while p <> nil do
        begin
          v := p^.val;
          DFS(v);
          p := p^.link;
        end;

      cc := 0;
      p := a[u];
      while p <> nil do
        begin
          v := p^.val;
          inc(cc);
          s[cc] := F[v];
          p := p^.link;
        end;

      for i := 1 to cc - 1 do
        for j := i + 1 to cc do
          if s[i] < s[j] then
            begin
              z := s[i];  s[i] := s[j];  s[j] := z;
            end;

      F[u] := s[1];
      rem := s[1] - 1;
      for i := 2 to cc do
        if rem < s[i] then
          begin
            F[u] := F[u] + s[i] - rem;
            rem := s[i] - 1;
          end
        else dec(rem);
    end;
end;

procedure printresult;
var
  fo: text;
begin
  assign(fo, output);
    rewrite(fo);
    writeln(fo, F[1]);
  close(fo);
end;

begin
  init;
  DFS(1);
  printresult;
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.