【分治】01串
在第一行我們寫上一個0。接下來的每一行,將前一行中的0替換為01,1替換為10。 給定行數N和序數K,返回第N行中第K個字符。(K從1開始)
輸入格式:
輸入在一行中給出2個整數N和K。 N的范圍[1,30]?K的范圍[1,2(N?1)]
輸出格式:
對每一組輸入,在一行中輸出第N行中第K個字符。
輸入樣例1:
1 1結尾無空行
輸出樣例1:
0結尾無空行
輸入樣例2:
2 1結尾無空行
輸出樣例2:
0結尾無空行
輸入樣例3:
2 2結尾無空行
輸出樣例3:
1結尾無空行
輸入樣例4:
4 5結尾無空行
輸出樣例4:
1結尾無空行
Hint:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001
解題報告:
思路1:找規律,發現:下一行=上一行+上一行按位取反
思路2:分治,按照線段樹的思路遞歸到第n層就好了。
AC代碼:
#include<iostream> #include<algorithm> #include<cstring> const int MAX = 2e6 + 6; using namespace std;int n, K; char ans; void dfs(int dep, int k, string cur) {if(dep == n) {ans = cur[k-1];return ;}int fen = 1<<(n-dep-1);if(k > fen) dfs(dep+1, k-fen ,cur == "01"?"10":"01");else dfs(dep+1, k, cur=="01"?"01":"10"); } int main() {cin>>n>>K;dfs(1, K, "01");cout << ans << endl;return 0; }總結
- 上一篇: 【机器学习】 - 关于Keras的深入理
- 下一篇: 申请信用卡需本人签字 申请信用卡不是本人