Luogu P1113 杂务

Luogu P1113 杂务

我真的不知道为什么这题是图论题……
因为第\(n\)件事的前驱只会在前\(n-1\)件事中,所以可以从第\(1\)件事开始遍历。
而且,最优的情况便是第\(i\)件事的结束时间尽量大(第\(1\)件事的结束时间就是第\(1\)件事的花费时间),就选择第\(i\)件事作为第\(n\)件事的前驱。
得到每件事的结束时间后,与\(ans\)取max即可。(注意这题是让我们求时间的最小值,但要用max取答案,思维容易走进误区)

#include<bits/stdc++.h>
#define N 50010

using namespace std;

int n,ans;

struct node {
    int time,finish,cnt;
    int pre[110];
}event[N];

void Read() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        int id,preevent;
        scanf("%d%d",&id,&event[i].time);
        while(scanf("%d",&preevent)&&preevent!=0) {
            event[i].pre[++event[i].cnt]=preevent;
        }
    }
    return;
}

void Solve() {
    event[1].finish=event[1].time;
    for(int i=2;i<=n;i++) {
        for(int j=1;j<=event[i].cnt;j++) {
            event[i].finish=max(event[i].finish,event[event[i].pre[j]].finish+event[i].time);
        }
        ans=max(ans,event[i].finish);
    }
    printf("%d",ans);
    return;
}

int main()
{
    Read();
    Solve();
    return 0;
}

转载于:https://www.cnblogs.com/luoshui-tianyi/p/11520926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值