赞
踩
时间限制: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;
- }
出现了以下情况 我也是一脸懵逼,不知道原因是什么,有没有大佬解释下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。