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.
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