列表

详情


NC201931. 酒馆战棋

描述

酒馆战棋是一个很有趣的游戏,这个游戏一共有两名玩家,每个玩家各自控制一定数量的随从,随从从左往右排列。
随从有两个基础属性:攻击力的血量,两个随从交战后会受到对方攻击力的伤害(失去对应的血量),当一个随从的血量降到 或者以下时会死亡。
整个对战流程如下:你的随从从左往右依次进行攻击,每次攻击是随机选择一个可以攻击的对方随从进行攻击。而对方的随从全程不动。
由于对方开了外挂,所以他的随从的血量和攻击力都是无穷大,而你的随从的攻击力和血量都是 ,但是随从除了攻击力和血量以外可能还有一些其他的属性:
  1. 圣盾:圣盾可以抵挡一次伤害,抵挡伤害后圣盾会消失。
  2. 剧毒:拥有剧毒属性的随从攻击力视为无穷大(由于你的随从的攻击力都是 ,所以只有剧毒属性才能击杀对方的随从)。
  3.  嘲讽:当对方场上有带有嘲讽的随从时,你只能攻击有嘲讽的随从。
现在已知你的随从从左往右分别有哪些属性,以及对方各种属性的随从有几个(显然对方随从的顺序并不会影响战斗)。
因为每次攻击是随机选择的,所以出题人经常被系统给演了,所以他想知道在所有情况下最多能消灭几只随从,以及最少能消灭几只随从。

输入描述

第一行一个正整数  表示数据组数 
对于每组数据:
第一行五个整数,表示你的随从个数,以及对方的普通随从,圣盾随从,嘲讽随从,圣盾嘲讽随从的个数。(因为对方的随从的属性都是无限大,所以剧毒对他来说没有意义)
第二行一个长度为 串,第 个字符为 表示从左往右第 个随从是否具有剧毒属性,若有则为 ,否则为 。(因为只需要关心消灭了几个随从,所以嘲讽和圣盾属性无意义)。
保证

输出描述

对于每组数据输出一行两个整数,表示最多消灭几个随从以及最少消灭几个随从。

示例1

输入:

1
5 2 2 2 1
10101

输出:

3 2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 496K, 提交时间: 2020-02-01 16:56:54

#include<bits/stdc++.h> 
using namespace std;
int n,a,b,c,d;
string s;
int mx,mn;
void maxx(){
	int a1=a,b1=b,c1=c,d1=d;
	//对方普,单盾,单嘲,盾嘲;
	for(int i=0;i<n;i++){
		if(s[i]=='0'){
			if(d1) d1--,c1++;
			else if(c1);
			else if(b1) b1--,a1++;
		}
		else{
			if(c1)mx++,c1--;
			else if(d1) d1--,c1++;
			else if(a1) a1--,mx++;
			else if(b1) b1--,a1++;
		}
	}	
}
void minn(){
	int a2=a,b2=b,c2=c,d2=d;
	//对方普,单盾,单嘲,盾嘲;
	for(int i=0;i<n;i++){
		if(s[i]=='1'){
			if(d2)d2--,c2++;
			else if(c2) c2--,mn++;
			else if(b2) b2--,a2++;
			else if(a2) a2--,mn++;
		}
		else{
			if(c2);
			else if(d2) d2--,c2++;
			else if(a2) ;
			else if(b2) b2--,a2++;
		}
	}	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		mx=0,mn=0;
		cin>>n>>a>>b>>c>>d;
		cin>>s;
		maxx();minn();
		cout<<mx<<" "<<mn<<"\n";
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 500K, 提交时间: 2020-02-02 15:05:32

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n,a,b,c,d;
		string s;
		int ans=0;
		int res=0;
		cin>>n>>a>>b>>c>>d;
		cin>>s;
		int a1=a,b1=b,c1=c,d1=d;
		for(int i=0;i<n;i++){
			if(s[i]=='1') {
				if(c)  ans++,c--;
				else if(d)  d--,c++;
				else if(a)  ans++,a--;
				else if(b)  b--,a++;
				
				if(d1)  d1--,c1++;
				else if(c1) c1--,res++;
				else if(b1)  b1--,a1++;
				else if(a1)  res++,a1--;    
			}
			else {
				if(d) d--,c++;
				else if(!c&&b) b--,a++;
				
				if(!c1 && d1) d1--,c1++;
				else if(!c1 && !d1 && !a1) b1--,a1++;
			}
			
		}
		cout<<ans<<" "<<res<<endl;	
	}
	return 0;
} 

上一题