M. Rock-Paper-Scissors Pyramid
该题需要找规律,常规做法的话,时间复杂度过不了。需要O(n^2)
由于最后获得的形状,显然是在n轮中获胜到最后的手势,也就是说,它是比它之前的手势获胜次数最多的手势。
#include<bits/stdc++.h>
using namespace std;
//为了方便计算,使用了哈希表。
unordered_map<string,int> mp{
//比之前的手势获胜,净胜-1
{"SP",-1},
{"PR",-1},
{"RS",-1},
//比之前的手势获胜,净胜+1
{"PS", 1},
{"RP", 1},
{"SR", 1},
//与之前的手势相同,不变
{"SS",0},
{"PP",0},
{"RR",0}
};
char Solve(string s){
int ans=0;
int p=-1;
int mps=-1;
for(int i=1;i<s.length();i++){
ans+= mp[s.substr(i-1,2)];
if(ans>mps&&ans>0){
p = i;
mps = ans;
}
}
if(mps!=-1){
return s[p];
}
//没更新的话,就说明,第一个就是最大的
else return s[0];
}
int main(){
int t;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--) {
string s;
cin>>s;
cout<<Solve(s)<<"\n";
}
}