题解:UVA12195 叮当作曲
xyx404
·
·
题解
题意总结:
每行一个字符串,分为好几节,每节用 `/` 分隔,求每个字符串有几个小节字母代表的值和为 $1$。
## 思路:
我不想处理小数,可以想到去分母,同乘分母最小公倍数 $64$,然后处理每个字符串,计算每小节的字母表示的数的和,如果这小节所有字母表示的数的和等于 $64$ 就让答案加一。
> 注意:多测不清空,爆零两行泪。
## 代码:
### 用 map 存字符表示值:
```cpp
#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 判断:
```cpp
#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;
}
```
~~这是闲话,好像南昌音乐机考会有这种题~~。