列表

详情


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;
}

上一题