Nordic Collegiate Programming Contest 2020 Damsindistress (dfs+思路)

31 篇文章 0 订阅
14 篇文章 0 订阅

链接

题意:

给定每个大坝先有水量以及总容量,超过总容量时就会流向下一级(靠近根)的大坝。问最少需要多少新的水可以使整个大坝体系的根崩溃?只往一个里面加水

分析:

首先我们知道要冲垮最后一个大坝也就是sum,然后我们用m表示所需的最小水量。我们用a[i]表示大坝容量,用b[i]表示大坝当前的水。
所以我们现在可以这样考虑状态:

  1. a[i]>sum,那么我们直接可以用a[i]-b[i]来代替sum和m,即a[i]-b[i]代替了最后一个大坝
    在这里插入图片描述

  2. a[i]<=sum,那么我们可以直接将其 b[i]灌入大坝,因为我们要冲垮最后一个大坝的水量一定大于a[i],所以 我们一定是冲垮a[i]之后过来的,就相当于我们直接把b[i]拿过来了。也就是sum变成sum-b[i],需要最小水量m变成m-b[i].

///苟利国家生死以,岂因祸福避趋之
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int ,int >
#define ll long long
const int mod = 1e9 + 7;
const int maxn = 2e5 + 7;
struct node {
    ll x,y,id;
};
std::vector<node> v[maxn];
ll n,m;
ll ans;
void dfs(ll num,ll sum,ll mm){
    ans=min(ans,mm);    
    if(sum<=0) return ;
    for(int i=0;i<v[num].size();i++){
        node top=v[num][i];
        if(top.x>sum){
            //if(top.x-top.y<=mm){                
                dfs(top.id,top.x-top.y,top.x-top.y);
            //}
        }else {
            dfs(top.id,sum-top.y,mm-top.y);
        }
    }
}
int main()
{    
    cin >> n>>m;
    ans=m;
    for(ll i=1;i<=n;i++){
        ll pre,x,y;
        cin>>pre>>x>>y;
        v[pre].push_back({x,y,i});
    }
    dfs(0,m,m);
    cout<<ans<<endl;
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值