当前位置:   article > 正文

牛客网刷题

牛客网刷题

时间限制: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;

具体思路:贪心

通过代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <string>
  6. #include <list>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <vector>
  11. #include <set>
  12. #define rg register
  13. #define rep(i,x,y) for(rg long long i=(x);i<=(y);++i)
  14. #define per(i,x,y) for(rg int i=(x);i>(y);--i)
  15. using namespace std;
  16. #define MAX 1000000
  17. #define ll long long
  18. ll n,k;
  19. ll arr[MAX];
  20. ll m;
  21. ll t;
  22. ll days=0;
  23. int main() {
  24. cin>>n>>m>>k>>t;
  25. rep(i,1,n){
  26. cin>>arr[i];
  27. days+=arr[i];
  28. }
  29. while(k--){
  30. int x;
  31. cin>>x;days-=arr[x];
  32. arr[x]=0;
  33. }
  34. while(m--){
  35. int x,y,h;
  36. cin>>x>>y>>h;
  37. int max=0;
  38. if(arr[x]>max)max=arr[x];
  39. if(arr[y]>max)max=arr[y];
  40. if(h>max){
  41. continue;
  42. }
  43. if(arr[x]>arr[y]){
  44. arr[x]=h;
  45. }else{
  46. arr[y]=h;
  47. }
  48. days+=h;
  49. days-=max;
  50. if(days<=t){
  51. cout<<"Yes"<<endl;
  52. return 0;
  53. }
  54. }
  55. /* rep(i,1,n){
  56. t-=arr[i];
  57. if(t<0){
  58. cout<<"No"<<endl;
  59. return 0;
  60. }
  61. }
  62. */
  63. cout<<"No"<<endl;
  64. return 0;
  65. }

我写的代码

  1. #include "iostream"
  2. using namespace std;
  3. #define LL long long
  4. #define maxn 1000000
  5. LL a[maxn];
  6. LL n,m,k,t;
  7. LL days=0;
  8. int main(int argc, char const *argv[]) {
  9. cin>>n>>m>>k>>t;
  10. for (size_t i =1; i <=n; i++){
  11. cin>>a[i];
  12. days+=a[i];
  13. }
  14. while(k--)
  15. {
  16. int x;
  17. cin>>x;
  18. days-=a[x];
  19. a[x]=0;
  20. }
  21. while(m--)
  22. {
  23. int x,y,k;
  24. cin>>x>>y>>k;
  25. int max=0;
  26. if(a[x]>max) max=a[x];
  27. if(a[y]>max) max=a[y];//比较两个任务谁的时间更长
  28. if(k>max)
  29. {
  30. continue;
  31. }
  32. if(a[x]>a[y])
  33. {
  34. a[x]=k;
  35. }
  36. else{ a[y]=k;}
  37. days+=k;
  38. days-=max;
  39. if(days<=t)//直到最后一个才可能小于 t 所以不要担心 m 减不到 0
  40. {
  41. cout<<"Yes"<<endl;
  42. return 0;
  43. }
  44. }
  45. cout<<"No"<<endl;
  46. return 0;
  47. }

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/457308
推荐阅读
相关标签
  

闽ICP备14008679号