文章目錄
- 前言
- 題目
- 詳細題解
- 寫法1 O ( n ) O(n) O(n)
- 推導證明
- 舉一反三
- 總結
前言
想想人真是有時候挺有限的,一直想做一個GitHub來著,然后一直拖了半個月,,,
這兩天算是勉強開始了,希望能堅持一下=-=

題目
小明正在玩一個“翻硬幣”的游戲,
桌上放著排成一排的若干硬幣,我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零),
比如,可能情形是:oo*oooo
如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo
現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少次呢?
我們約定:把翻動相鄰的兩個硬幣叫做一步操作,
輸入格式
兩行等長的字串,分別表示初始狀態和要達到的目標狀態,
輸出格式
一個整數,表示最小操作步數
資料范圍
輸入字串的長度均不超過100,
資料保證答案一定有解,
輸入樣例1:
**********
o****o****
輸出樣例1:
5
輸入樣例2:
*o**o***o***
*o***o**o***
輸出樣例2:
1

詳細題解
寫法1 O ( n ) O(n) O(n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
string a, b;
void turn(int i)
{
if(a[i] == '*') a[i] = 'o';
else a[i] = '*';
}
int main()
{
cin >> a >> b;
int ans = 0;
for (int i = 0; i < a.size() - 1; ++ i )
if (a[i] != b[i])
{
++ ans;
turn(i), turn(i + 1);
}
cout << ans << endl;
return 0;
}
毫無疑問,這是個簡單題,遞推即可完成,
最后提交,AC😁

推導證明
以實體為例子進行講解,可以看出每個位置只會變化一次,不然就相當于沒有變化,

所以從頭開始遍歷:
- 如果不同,那么翻轉當前位置和下一位置;
- 如果相同,那么不翻轉;
- 嚴謹地說,判斷翻轉后的最后位置是否相同,
- 如果相同,輸出結果;
- 如果不同,輸出-1;
舉一反三
多多思考,那么你就贏了
總結
繼續努力,堅持更新,11th打卡,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257872.html
標籤:其他
