
题意总结:
7 个字母 W
,H
,Q
,E
,S
,T
,X
分别代表着 1,21,41,81,161,321,641。
每行一个字符串,分为好几节,每节用 /
分隔,求每个字符串有几个小节字母代表的值和为 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; mp['H']=32; mp['Q']=16; mp['E']=8; 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; }
|
这是闲话,好像南昌音乐机考会有这种题。