森林问题(forest)[30分]

算法:贪心

分析:应该说是骗的30分吧……

program forest;

const
 maxn=30000;

var
 n,m,ans:longint;
 ljb:array [0..maxn,0..100] of longint;
 v:array [0..maxn] of longint;

procedure init;
var
 i,j,x,xx,dis:longint;
begin
 ans:=0;
 fillchar(v,sizeof(v),0);
 readln(n);
 for i:=1 to n do
  begin
   read(x);
   for j:=1 to x do
    begin
     read(xx,dis);
     inc(ljb[i,0]);
     ljb[i,ljb[i,0]]:=xx;
     v[xx]:=v[i]+dis;
    end;
  end;
 readln(m);
end;

procedure qsort(l,r:longint);
var
 i,j,m,t:longint;
begin
 i:=l;
 j:=r;
 m:=v[(l+r) shr 1];
 repeat
  while v[i]<m do inc(i);
  while v[j]>m do dec(j);
  if i<=j then
   begin
    t:=v[i];
    v[i]:=v[j];
    v[j]:=t;
    inc(i);
    dec(j);
   end;
 until i>j;
 if i<r then qsort(i,r);
 if l<j then qsort(l,j);
end;

procedure change(x,tt:longint);
var
 i:longint;
begin
 if ljb[x,0]=0 then
  begin
   dec(v[x],tt);
   exit;
  end;
 for i:=1 to ljb[x,0] do
  begin
   change(ljb[x,i],v[x]);
   dec(v[ljb[x,i]],v[x]);
  end;
end;

procedure main;
var
 i:longint;
begin
 for i:=1 to n do
  begin
   if v[i]>m then
    begin
     inc(ans);
     change(i,v[i]);
     v[i]:=0;
    end;
  end;
end;

begin
 assign(input,'forest.in'); reset(input);
 assign(output,'forest.out'); rewrite(output);

 init;
 main;
 writeln(ans);

 close(input); close(output);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值