AcWing 1208. 翻硬币
考察:递推
错误思路:
bfs,会TLE,如果不判重的话会MLE.在最坏情况下字符串长度100,有99个不同的选择.假设一个起始字符串与目标字符串完全不同则起码50步.这50步每步都有99种选择.时间复杂度50^99
正确思路:
将起始字符串每一个间隔看成一个开关.当第一个字符不同,只能按第一个开关.当第二个字符不同只能按第二个开关..以此类推.当到最后一个字符,已经不能再按开关了,因此有无解看最后一个字符.时间复杂度O(n)
与费解的开关很像,本蒟蒻完全没想到
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <string> 5 using namespace std; 6 string a,b; 7 void turn(char& c) 8 { 9 if(c=='*') c = 'o'; 10 else c = '*'; 11 } 12 int solve() 13 { 14 int cnt = 0; 15 for(int i=0;i<a.size()-1;i++) 16 { 17 if(a[i]!=b[i]) 18 { 19 turn(a[i]); 20 turn(a[i+1]); 21 cnt++; 22 } 23 } 24 return cnt; 25 } 26 int main() 27 { 28 cin>>a>>b; 29 printf("%d\n",solve()); 30 return 0; 31 }