装饰

版权声明:未经过同意不得转载 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;
}

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/89515392