zoukankan      html  css  js  c++  java
  • G、CSL 的训练计划【BFS 贪心】(“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/G

    链接:https://ac.nowcoder.com/acm/contest/551/G
    来源:牛客网

    题目描述

    众所周知,CSL 是一个负责的集训队队长。为了让集训队的学弟们训练更加饱和,他根据每个人的能力,提出了 m 个题数要求。假如 CSL 认为 yiyi 比 xixi 强,那么如果 xixi 做了 a 题,那 CSL 会要求 yiyi 需要做至少 a+ri×ka+ri×k,其中 riri 是已知的常数。CSL 现在一共有 s 道题目可以分给大家,因为 CSL 马上就要考OS了,所以他不想再出其他题了,请问正整数 k 最大是多少。

    输入描述:

    第一行有三个整数 n, m, s,分别表示集训队的学弟数量,CSL 的题数要求和 CSL 的题目数量。

    接下来 m 行,每行三个整数 xi,yi,rixi,yi,ri,含义题目描述中所述。
     
    2n21052≤n≤2⋅105
    1m61051≤m≤6⋅105
    1s10121≤s≤1012
    1xi,yin1≤xi,yi≤n
    0ri1060≤ri≤106

    输出描述:

    在一行输出一个整数表示 k 可取的最大值。特别地,如果题目不够分则输出 0;为无穷大输出 -1。
    示例1

    输入

    复制
    4 5 19
    1 3 0
    3 4 4
    1 4 2
    1 3 2
    2 4 1

    输出

    复制
    2
    示例2

    输入

    复制
    5 5 6
    5 4 2
    3 2 1
    3 5 3
    2 4 4
    5 2 1

    输出

    复制
    0

    备注:

    强度是具有传递性的,如果 x 比 y 强且 y 比 z 强,那么 CSL 不会认为 z 比 x 强。

    输入数据量较大,建议使用高效的输入输出方式。例如:在 C++ 中使用 scanf/printf 代替 cin/cout;在 Java 中使用 BufferedReader/PrintWriter 代替 Scanner/System.out。

    解题思路:

    一开始想的是二分答案。

    其实按照最优状态贪心下去根本不需要二分。

    最优的肯定是入度为 0 的点刷题数都为 0 这样能保证后面乘 k 能更大。

    那么画个图就可以看出来,就只剩下 r*k 了,最后答案再把公因数 k 提取出来,就只剩下 r了

    BFS 最长路即可。

    最后所有路径加起来就是总的 r ,用 S/r 即 k。

    AC code:

     1 #include <bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 #define LL long long
     4 #define inc(i, j, k) for(int i = j; i <= k; i++)
     5 #define rep(i, j, k) for(int i = j; i < k; i++)
     6 #define mem(i, j) memset(i, j, sizeof(i))
     7 #define gcd(i, j) __gcd(i, j)
     8 using namespace std;
     9 const int MAXN = 2e5+10;
    10 struct data
    11 {
    12     int v;
    13     LL r;
    14 };
    15 vector<data>mmp[MAXN];
    16 int N, M;
    17 LL S;
    18 int in[MAXN];
    19 LL dp[MAXN];
    20 queue<int>que;
    21 int main()
    22 {
    23     int u, v;
    24     LL r;
    25     scanf("%d %d %lld", &N, &M, &S);
    26     inc(i, 1, M){
    27         scanf("%d %d %lld", &u, &v, &r);
    28         mmp[u].push_back({v, r});
    29         in[v]++;
    30 //        mmp[v].push_back({u, r});
    31     }
    32     inc(i, 1, N) if(in[i] == 0) que.push(i);
    33     while(!que.empty()){
    34         u = que.front();que.pop();
    35         for(auto x:mmp[u]){
    36             if(dp[x.v] < dp[u]+x.r)
    37                 dp[x.v] = dp[u]+x.r;
    38             if(--in[x.v] == 0) que.push(x.v);
    39         }
    40     }
    41     LL sum = 0;
    42     inc(i, 1, N) sum+=dp[i];
    43     if(sum == 0) puts("-1");
    44     else{
    45         printf("%lld
    ", S/sum);
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    听说-- 迭代
    听说
    听说---时序图
    闪屏
    WBS
    听说
    Agile Development ----敏捷开发
    软件测试
    需求分析:WBS图
    2048小游戏
  • 原文地址:https://www.cnblogs.com/ymzjj/p/10665409.html
Copyright © 2011-2022 走看看