列表

详情


NC23995. CSL 的训练计划

描述

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

输入描述

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

接下来 m 行,每行三个整数 x_i, y_i, r_i,含义题目描述中所述。






输出描述

在一行输出一个整数表示 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 836ms, 内存消耗: 17400K, 提交时间: 2019-04-01 14:24:39

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int x[2000005];
int y[2000005];
int r[2000005];
LL dis[2000005];
int main()
{
    int n,m;
    LL s;
    cin>>n>>m>>s;
    for(int i=0;i<m;i++)
        cin>>x[i]>>y[i]>>r[i];
    int flag=1;
    while(flag) {
        flag=0;
        for(int i=0;i<m;i++) {
            if(dis[x[i]]+r[i]>dis[y[i]]) {
                flag=1;
                dis[y[i]]=dis[x[i]]+r[i];
            }
        }
    }
    LL sum=0;
    for(int i=1;i<=n;i++)
        sum+=dis[i];
    if(sum==0) {
        puts("-1");
    }
    else if(sum>s) {
        puts("0");
    }
    else {
        cout<< s/sum;
    }
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 537ms, 内存消耗: 15204K, 提交时间: 2020-02-27 00:03:58

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n,m,s,x[600100],y[600100],r[600100],a[200100],tol=0;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld %lld %lld",&x[i],&y[i],&r[i]);
		if((a[x[i]]+r[i])>a[y[i]])
		{
			a[y[i]]=a[x[i]]+r[i];
		}
	}
	for(int i=1;i<=100;i++)
	{
		for(int  j=1;j<=m;j++)
		{
			if((a[x[j]]+r[j])>a[y[j]])
			{
				a[y[j]]=a[x[j]]+r[j];
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		tol+=a[i];
	}
	if(tol==0)
	{
		cout<<"-1";
	}
	else
	{
		cout<<s/tol;
	}
	return 0;
}

上一题