跳过正文
题解:UVA12195 叮当作曲

题解:UVA12195 叮当作曲

xyx404
作者
xyx404
Have a nice day.

封面

{% link 洛谷文章链接,xyx404,https://www.luogu.com.cn/article/mdn6jl0j %}

题意总结:
#

$7$ 个字母 WHQESTX 分别代表着 $1,\dfrac{1}{2},\dfrac{1}{4},\dfrac{1}{8},\dfrac{1}{16},\dfrac{1}{32},\dfrac{1}{64}$。
每行一个字符串,分为好几节,每节用 / 分隔,求每个字符串有几个小节字母代表的值和为 $1$。

思路:
#

我不想处理小数,可以想到去分母,同乘分母最小公倍数 $64$,然后处理每个字符串,计算每小节的字母表示的数的和,如果这小节所有字母表示的数的和等于 $64$ 就让答案加一。

注意:多测不清空,爆零两行泪。

代码:
#

用 map 存字符表示值:
#

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
string s;
unordered_map<char,int>mp;
int main(){
	mp['W']=64;// 不用小数同乘分母的最小公倍数 64
	mp['H']=32;// 也就变成了判断一小节的和是否为 64
	mp['Q']=16;// 是 ans++
	mp['E']=8;// 否 ans 不变
	mp['S']=4;
	mp['T']=2;
	mp['X']=1;
	while(getline(cin,s)){
		if(s=="*")break;
		LL ans=0,cnt=0;;
		for(int i=0;i<s.size();i++){
			if(s[i]=='/'){
				ans+=(cnt==64);
				cnt=0;
			}
			else{
				cnt+=mp[s[i]];
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

使用 if 判断:
#

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
string s;
int main(){
	while(getline(cin,s)){
		if(s=="*")break;
		LL ans=0,cnt=0;;
		for(int i=0;i<s.size();i++){
			if(s[i]=='/'){
				ans+=(cnt==64);
				cnt=0;
			}
			else{
				if(s[i]=='W')cnt+=64;
				else if(s[i]=='H')cnt+=32;
				else if(s[i]=='Q')cnt+=16;
				else if(s[i]=='E')cnt+=8;
				else if(s[i]=='S')cnt+=4;
				else if(s[i]=='T')cnt+=2;
				else if(s[i]=='X')cnt+=1;
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

这是闲话,好像南昌音乐机考会有这种题