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 }

 

posted @ 2021-01-18 20:52  acmloser  阅读(51)  评论(0编辑  收藏  举报