题解 P7369 【[COCI2018-2019#4] Elder】

题意

一开始一个魔杖在一个巫师手中,接下来 NN 轮战斗,每轮下来如果拿着魔杖的巫师被打败,就把魔杖传给下一个巫师。

求:

1.1. 最后拿着魔杖的巫师。

2.2. 拿过魔杖的巫师的个数。

分析

对于第一个问题:我们可以把被老魔杖效忠的巫师抽象成一个变量,一开始先赋值成老魔杖的原主人,接下来每轮如果被老魔杖效忠的巫师被打败,就把胜利的巫师覆盖在原来的上面,最后变量的值就是最后效忠的巫师。

对于第二个问题:我们建立一个 bool 型的 bb 数组,表示某个巫师是否被效忠过,因为表示巫师的都是大写字母,所以只要 bool b[26] 就行了,若某个巫师的大写字母用 cc 来表示,则他对应的下标为 cA c-'A\ '。我们在解决第一个问题的同时,可以不断把每个覆盖的巫师对应的 bcA b_{c-'A\ '} 赋值为 tureture,最后统计一下就行了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,sum;
char c,winner,loser;
bool b[26];
int main()
{
    cin>>c;
	cin>>n;
    b[c-'A']=1;//第一次效忠的主人也要算上 
    for(int i=1;i<=n;i++)
    {
    	cin>>winner>>loser;
    	if(c==loser)//如果目前效忠的主人失败了 
    	{
    		c=winner;//改变当前的主人 
    		b[c-'A']=1;//效忠新主人 
		}
	}
	for(int i=0;i<26;i++)
	if(b[i])sum++;//如果这个主人效忠过就加1 
	cout<<c<<endl;
	cout<<sum<<endl;
	return 0;
}
posted @ 2021-02-19 15:21  luckydrawbox  阅读(7)  评论(0)    收藏  举报  来源