首页 > 其他分享 >20221114_T4B_拓扑排序贪心

20221114_T4B_拓扑排序贪心

时间:2022-11-14 18:44:48浏览次数:48  
标签:会议 int 主持人 拓扑 20221114 read T4B void 贪心

题意

L国正在举行各种会议,但是可怜的是L国只有一个主持人,每场会议的开始主持人都必须去主持会议,使会议得以开始,在会议开始后主持人可以离开。 主持人不会分身,他在一个时刻只能主持一场会议,但是可以忽略主持人在各个会场间移动的时间。每个会议都有一个自己的持续时间,会议之间也有一些形如B必须在A之前的约束关系。但是大家都想早点溜了,他们找到了你,让你安排一种会议举办的方式,使得最晚结束的会议最早。

题解

赛时得分 0/100/100

这题有点思维。没有代码难度。

首先,我们就是要 t 最大的字典序最小,这样的话肯定更优。所以我们应该能想到贪心的选取 t 大的,那么怎么保证拓扑序呢?

我们建反图,0 向所有点建图,这样的话只有把跟该节点有关的边全部走完我才可以走其他的点。

这正好满足了拓扑序。

代码

#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){t=0; register char ch=getchar(); register int fflag=1;while(!('0'<=ch&&ch<='9')) {if(ch=='-') fflag=-1;ch=getchar();}while(('0'<=ch&&ch<='9')){t=t*10+ch-'0'; ch=getchar();} t*=fflag;}
template <typename T,typename... Args> inline void read(T& t, Args&... args) {read(t);read(args...);}
const int N = 1e5 + 10, inf = 0x3f3f3f3f;

priority_queue<pair<int, int> >Q[N];
vector<int>G[N];
int n, d[N], t[N], T = -1;
bool vis[N];

void dfs(int u) {
    t[u] = ++T;
    vis[u] = 1;
    while(!Q[u].empty()) {
        int v = Q[u].top().second; Q[u].pop();
        // cout << u << ' ' << v << endl;
        if(vis[v]) continue;
        dfs(v);
    }
    // cout << T << endl;
    cout << u << ' ' << t[u] << endl;
}

int main() {
    read(n);
    for(int i = 1; i <= n; ++i) {
        read(d[i]);
        int ti; read(ti);
        if(!ti) Q[0].push(make_pair(d[i], 0));
        // if(!ti) Q[i].push(make_pair(0, 0));
        while(ti--) {
            int p;
            read(p);
            G[i].push_back(p);
        }
    }
    // for(int i = 1; i <= n; ++i) G[0].push_back(i);
    for(int i = 0; i <= n; ++i) 
        for(int v : G[i]) Q[i].push(make_pair(d[v], v));
    dfs(0);
    int ans = 0;
    for(int i = 1; i <= n; ++i) ans = max(ans, d[i] + t[i]);
    cout << ans << endl;
    return 0;
}

标签:会议,int,主持人,拓扑,20221114,read,T4B,void,贪心
From: https://www.cnblogs.com/Mercury-City/p/16889966.html

相关文章

  • 代码随想录训练营第三十二天|贪心算法
    本来这是第三十一天的内容,但是三十一天的时候写成第三十二天的了,因此今天写第三十一天的内容 455.分发饼干 classSolution{publicintfindContentChildre......
  • 今日笔记之20221114
    1.vue中刷新页面,echarts图表不显示问题? <divid="myChart"></div><script>exportdefault{data(){return{myChart:{}}},mounted:{this.init......
  • 20221113_T2A_背包贪心
    题意Steve的城堡正在被大量的怪物袭击。共有\(n\)个怪物正在袭击城堡,第\(i\)个怪物的攻击力为\(a_i\),防御力为\(b_i\)。城内有\(m\)个怪物猎人,第\(j\)个怪物......
  • 代码随想录训练营第三十一天 | 贪心算法
    贪心算法的核心思想是在每一步决策中都找到局部最优解122.买卖股票的最佳时机classSolution{publicintmaxProfit(int[]prices){intn=prices.le......
  • 贪心
    455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的......
  • 20221007_T1A-_贪心/树形dp
    题意给定一个树,求经过\(k\)个不同点所需要的步骤。以及给出一个方案。题解赛时得分:5/100不知道赛时哪里写错了。能想到找出以1开始的直径,直径上的点是必定会走的......
  • 【UOJ 494】DNA序列(贪心)(Lyndon分解)
    DNA序列题目链接:UOJ494题目大意给你n个字符串,要你每个都选一段非空前缀按某种顺序拼在一起使得形成的大字符串字典序最小。思路假设如果知道插入的顺序,我们要怎么......
  • 贪心算法_Leetcode刷题_7/100
    贪心算法采用贪心策略,保证每次操作是局部最优的,从而使随后结果是全局最优的。455.分配饼干贪心策略:尽量把最小的饼干分配给胃口最小的孩子。我的代码:算法描述:将......
  • Great Sequence (CF2,C) (贪心)
    思路:最后转化成一个链,然后贪心地从链的一端处理即可! #include<bits/stdc++.h>usingnamespacestd;#defineM2000005#defineriregisterintlonglo......
  • 五大基本算法:贪心算法
    今天是学习算法的第一天,以后每天都会坚持学习一个算法,当然是要学懂学会,而不是浅尝辄止.每一个学会的算法都会记录下来,以方便后面复习查阅.贪心算法有很多经典的应......