题意:给出字符串长度n,和两个字符串,输出不大于字符串s不小于字符串t的集合的最中间字符串(类似中位数那种)。
思路:我先尝试在想是否是 集合个数除以2 然后加到最小的字符串上去(中位数思想),然后又在找两个字符串中间个数的时发现 集合个数为 (26-'a')*(26-"b)...这种形式 ,所以估计为转化26进制的运算
(事实上这就是这道题的做法,然鹅我却写bug一直没调出来)对于模拟问题,思路一定要清晰,本身这类题就没什么难度
题解:
#include <string> #include <iostream> using namespace std; int ans[200010]; string s,t; int main() { int n; cin>>n>>s>>t; //模拟26位进制加减, 对于这种问题如果在加的时候就模拟进位或许会写乱, //所以我们把步骤分开一步一步来 //求和 for(int i=0;i<n;i++) ans[i] = (s[i]-'a')+(t[i]-'a'); //进位 for(int i=n-1;i>0;i--){ if(ans[i]>=26){ ans[i]-=26; ans[i-1]++; } } //取中 for(int i=0;i<n;i++){ if(ans[i]%2){ ans[i] /= 2; ans[i+1]+=26; }else ans[i] /= 2; } //输出 for(int i=0;i<n;i++){ printf("%c",ans[i]+'a'); } printf("\n"); return 0; }