牛客网刷题

时间限制: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<t)  则yes,else 则 No;

具体思路:贪心

通过代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#define rg register
#define rep(i,x,y) for(rg long long i=(x);i<=(y);++i)
#define per(i,x,y) for(rg int i=(x);i>(y);--i)
using namespace std;
#define MAX 1000000
#define ll long long
ll n,k;
ll arr[MAX];
ll m;
ll t;
ll days=0;
int main() {
    cin>>n>>m>>k>>t;
    rep(i,1,n){
        cin>>arr[i];
        days+=arr[i];
    }
    while(k--){
        int x;
        cin>>x;days-=arr[x];
        arr[x]=0;
         
    }
    while(m--){
        int x,y,h;
        cin>>x>>y>>h;
        int max=0;
        if(arr[x]>max)max=arr[x];
        if(arr[y]>max)max=arr[y];
        if(h>max){
            continue;
        }
        if(arr[x]>arr[y]){
            arr[x]=h;
        }else{
            arr[y]=h;
        }
        days+=h;
        days-=max;
        if(days<=t){
            cout<<"Yes"<<endl;
            return 0;
        }
    }
     
/*    rep(i,1,n){
        t-=arr[i];
        if(t<0){
            cout<<"No"<<endl;
            return 0;
        }
    }
 */
    cout<<"No"<<endl;
    return 0;
}

我写的代码

#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"<<endl;
      return 0;
    }
  }
  cout<<"No"<<endl;
  return 0;
}

出现了以下情况 我也是一脸懵逼,不知道原因是什么,有没有大佬解释下

猜你喜欢

转载自blog.csdn.net/shuaizhijun/article/details/89052789