使用最短路,只有#1和#5对了,求助一下
查看原帖
使用最短路,只有#1和#5对了,求助一下
264548
Tangent233楼主2021/7/20 15:05
/*
尼克的一个工作日为 n 分钟
公司一共有 k 个任务需要完成
如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,
反之如果只有一个任务,则该任务必需由尼克去完成,
假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。
如果某任务于第 p 分钟开始,持续时间为 t 分钟,则该任务将在第 (p+t-1) 分钟结束。
求最大空闲时间
设
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
struct edge
{
    int t,v;
};
vector<edge> g[maxn];
int dis[maxn];bool vis[maxn];
void dij(int s)
{
    memset(dis,0x3f3f3f,sizeof(dis));
    priority_queue< pair<int,int> > q;
    dis[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty())
    {
        //cout<<"a"<<endl;
        int p=q.top().second;
        q.pop();
        if(vis[p]) continue;
        vis[p]=1;
        for(int i=0;i<g[p].size();i++)
        {
            int t=g[p][i].t,v=g[p][i].v;
            if(dis[t]>dis[p]+v)
            {
                dis[t]=dis[p]+v;
                q.push(make_pair(-dis[t],t));
            }
        }
    }
}
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        int a,b;cin>>a>>b;
        g[a].push_back((edge){a+b,b});
    }
    for(int i=1;i<=n;i++)
        if(g[i].size()==0) g[i].push_back(edge{i+1,0});
    dij(1);
    cout<<n-dis[n];
    return 0;
}

我真看不懂dp(

2021/7/20 15:05
加载中...