题解:UVA12195 叮当作曲

封面

题意总结:

77 个字母 WHQESTX 分别代表着 1,12,14,18,116,132,1641,\dfrac{1}{2},\dfrac{1}{4},\dfrac{1}{8},\dfrac{1}{16},\dfrac{1}{32},\dfrac{1}{64}
每行一个字符串,分为好几节,每节用 / 分隔,求每个字符串有几个小节字母代表的值和为 11

思路:

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

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

代码:

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

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