时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
立华奏是一个刚刚开始学习 OI 的萌新。
最近,实力强大的 Qingyu
当选了 IODS 9102 的出题人。众所周知, IODS 是一场极其毒瘤的比赛。为了在这次比赛中取得好的成绩,立华奏决定学习可能考到的每一个知识点。
在 Qingyu 的博客中,立华奏得知这场比赛总共会考察选手 n 个知识点。此前,立华奏已经依靠自学学习了其中 k 个知识点。接下来,立华奏需要学习其他的知识点,每学习一个单独的知识点,需要消耗的时间为 Ti 天。同时,某些知识点之间存在联系,可以加速学习的过程。经过计算,立华奏一共发现了其中 m 种联系,第 i 种联系可以表示为(Xi,Yi,Hi),其含义为“在掌握了第 Xi 个知识点和第 Yi 个知识点中任意一个后,学习 Hi
天即可掌握另一个知识点”。
留给立华奏的时间所剩无几,只有 t 天,因此,她想知道自己能不能在这 t 天内学习完成所有的知识点。
本题输入量较大,请注意使用效率较高的读入方式 输入的第一行包含四个整数 n, m, k, t,含义见上所述。
接下来一行,包含 n 个整数,依次表示 T1,T2,⋯,Tn
接下来一行,包含 k 个整数,表示立华奏已经学习过的知识点。如果 k=0,则此处为一空行。
接下来 m 行,每行 3 个整数 Xi,Yi,Hi,描述一种联系。
如果立华奏能够学习完所有的知识点,输出一行 Yes。否则输出 No
输入
4 3 2 5
4 5 6 7
2 3
1 2 3
1 3 2
3 4 2
输出
Yes
思路:先把总共需要的天数求出来,减去已经学过的知识点所需要的天数,在根据关系比较a[i],a[j]与h的关系取min(a[i],a[j],h)
然后把days拿来与t做比较 if(days
具体思路:贪心
通过代码
#include
#include
#include
#include
#include
#include
#include
我写的代码
#include "iostream"
using namespace std;
#define LL long long
#define maxn 1000000
LL a[maxn];
LL n,m,k,t;
LL days=0;
int main(int argc, char const *argv[]) {
cin>>n>>m>>k>>t;
for (size_t i =1; i <=n; i++){
cin>>a[i];
days+=a[i];
}
while(k--)
{
int x;
cin>>x;
days-=a[x];
a[x]=0;
}
while(m--)
{
int x,y,k;
cin>>x>>y>>k;
int max=0;
if(a[x]>max) max=a[x];
if(a[y]>max) max=a[y];//比较两个任务谁的时间更长
if(k>max)
{
continue;
}
if(a[x]>a[y])
{
a[x]=k;
}
else{ a[y]=k;}
days+=k;
days-=max;
if(days<=t)//直到最后一个才可能小于 t 所以不要担心 m 减不到 0
{
cout<<"Yes"<
出现了以下情况 我也是一脸懵逼,不知道原因是什么,有没有大佬解释下