NC223420. 永不言弃
描述
小沙最喜欢打怪升级了,今天他玩了一个游戏,需要从初始关卡开始,击败个关卡才能通关整个游戏,对于每个关卡都会有两种通过方式。
小沙初始的属性值为,当游戏角色的属性大于关卡最高上限时,可以强行通过该关卡,又或者拥有通过该关卡的必过道具(并不是消耗品)。每个关卡通过后可能会开启一个或多个后置关卡,但每个关卡开启也需要若干个前置关卡,只有前置关卡全部通过后,才能开启该关卡。特别注意,除了一号关卡,如果一个关卡没有任何前置关卡,那么这个关卡则永远无法开启。
每个关卡仅能游玩一次,且每个关卡通过都会增强小沙角色的属性,也会给予一个必过道具。目前小沙正在一号关卡,请问小沙能否将这个游戏打通。
输入描述
第一行输入两个正整数,,其中:,。
接下来行,每行输入两个正整数,,分别代表第关暴力通过需要的属性值,以及该关卡所需的必过道具,其中:,。
接下来行,每行输入两个正整数,,分别代表通过第关后,可以增加的属性值,以及可以获得的必过道具,其中:,。
接下来行,每行首先输入一个非负整数,代表有多少个后置关卡,随后个整数代表第关的后置关卡。其中:,后置关卡号小于等于。
输出描述
如果能够通关输出Yes,否则输出No。
示例1
输入:
3 3 1 2 2 1 2 1 1 2 2 1 3 2 1 2 1 3 0
输出:
Yes
C++(clang++ 11.0.1) 解法, 执行用时: 94ms, 内存消耗: 6176K, 提交时间: 2023-05-27 19:29:38
#include<bits/stdc++.h> using namespace std; const int mxv=5e4+9; #define int long long int a[mxv],b[mxv],c[mxv],d[mxv]; int in[mxv],vis[mxv]; vector<int> ve[mxv]; int n,s; priority_queue<pair<int,int>> qu; signed main(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>s; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; for(int i=1;i<=n;i++) cin>>c[i]>>d[i]; for(int k,i=1;i<=n;i++){ cin>>k; for(int x,j=1;j<=k;j++){ cin>>x; ve[i].push_back(x),in[x]++; } } qu.push({-a[1],1}); int ans=0; while(!qu.empty()){ int xx=qu.top().second; qu.pop(); if(vis[b[xx]]||s>=a[xx]){ vis[d[xx]]=1,s+=c[xx]; ans++; for(int i=0;i<ve[xx].size();i++){ int yy=ve[xx][i]; in[yy]--; if(in[yy]==0) qu.push({-a[yy],yy}); } } } if(ans==n) cout<<"Yes\n"; else cout<<"No\n"; return 0; }