Treasure Hunt
题 意:有三个人玩一个游戏,每个人都已一串字符串si,有n轮操作,每轮操作,每个人都可以将自己的字符串中的一个值变成令一种(不同于修改之前的),问n轮操作之后,每个人的字符串的字串在字符串中重复次数最多的是那个。如果有至少有两个最大则输出”Draw”,如果第一个最大输出”Kuro” ,第二个最大输出”Shiro”,第三个最大输出”Katie”。
数据范围:
0<=n<=1e9
0<=|si|<=1e5
输入样例:
3
Kuroo
Shiro
Katie
输出样例:
Kuro
思 路:很容易想到单个字符重复次数是最优的。所有看看那个串经过n论修改后,那个串中相同字符最多。如果当前串字母出现最多的次数t+n >= len 那么t=len。注意一种情况,那就是当t == len && n == 1的时候,这个时候t == len-1。
收 获:情况要考虑到位。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
typedef long long ll;
int n;
map<char,int> mp[3];
char s[maxn];
int len[3];
int main() {
scanf("%d",&n);
for(int i=0;i<3;i++){
scanf("%s",s);
len[i] = strlen(s);
for(int j=0;j<len[i];j++){
char temp = s[j];
mp[i][temp] ++;
}
}
map<char,int>::iterator it;
int ans1 = -1,ans2 =-1,ans3 = -1;
for(it = mp[0].begin();it!=mp[0].end();it++){
ans1 = max(ans1,it->second);
}
for(it = mp[1].begin();it!=mp[1].end();it++){
ans2 = max(ans2,it->second);
}
for(it = mp[2].begin();it!=mp[2].end();it++){
ans3 = max(ans3,it->second);
}
if(ans1 == len[0] && n == 1){
ans1 = len[0]-1;
}else if(ans1+n>=len[0]){
ans1 = len[0];
}else{
ans1 = ans1+n;
}
if(ans2 == len[1] && n == 1){
ans2 = len[1]-1;
}else if(ans2+n>=len[1]){
ans2 = len[1];
}else{
ans2 = ans2+n;
}
if(ans3 == len[2] && n == 1){
ans3= len[2]-1;
}else if(ans3+n>=len[2]){
ans3 = len[2];
}else{
ans3 = ans3+n;
}
//printf("%d %d %d %d %d %d\n",ans1,ans2,ans3,len[0],len[1],len[2]);
if(ans1 == ans2 && ans1 > ans3 ){
printf("Draw\n");
return 0;
}
if(ans1 == ans3 && ans1 > ans2){
printf("Draw\n");
return 0;
}
if(ans2 == ans3 && ans2 > ans1){
printf("Draw\n");
return 0;
}
if(ans2 == ans3 && ans2 == ans1){
printf("Draw\n");
return 0;
}
if(ans1 > ans2 && ans1 > ans3){
printf("Kuro\n");
return 0;
}
if(ans2 > ans1 && ans2 > ans3){
printf("Shiro\n");
return 0;
}
if(ans3 > ans1 && ans3 > ans2){
printf("Katie\n");
return 0;
}
return 0;
}