版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/89515392
这道题和一道贪心题很想,就是给你一些时间,在规定的时间内,有用的时间最多,就是把每个时间的右端点排序,然后看如何使用的时间最少,从最少的地方挑时间
#include<bits/stdc++.h>
using namespace std;
const long long maxn=100005;
long long P[maxn],C[maxn],T[maxn];
long long dp[maxn],minCost[maxn];
long long sum[maxn];
long long n;
vector<long long> g[maxn];
void dfs(long long v)
{
minCost[v]=T[v];
long long done=0;
for(long long i=0;i<g[v].size();i++)
{
long long u=g[v][i];
dfs(u);
minCost[v]=min(minCost[v],minCost[u]);
done+=sum[u];
dp[v]+=dp[u];
sum[v]+=sum[u];
}
sum[v]=max(done,C[v]);
done=min(done,C[v]);
dp[v]+=minCost[v]*(C[v]-done);
}
bool is_prime(long long x)
{
if(x==0||x==1)
return false;
for(long long i=2;i<=int(sqrt(x));i++)
{
if(x%i==0)
return false;
}
return true;
}
int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
cin>>P[i]>>C[i]>>T[i];
for(long long i=2;i<=n;i++)
g[P[i]].push_back(i);
dfs(1);
cout<<dp[1]<<endl;
return 0;
}