51Nod 1491 黃金系統

2021-07-23 06:54:05 字數 1950 閱讀 8154

acm模版

拿到這種題,不用多想,先列舉一些q^i,可以發現在某種程度上其符合斐波那契數列……

q^0a表示,q^1b表示,

我們可以發現,每乙個數都可以用xa + yb表示,

而這裡的x和y在一定程度上都符合斐波那契數列。

這也就給了我初始的想法,能否遍歷一遍,

遇見連續兩位都是1的時候就減去這兩個1繼而在高位添1

就著這個想法嘗試,這時注意到n-i的問題,

於是乎,想了乙個辦法就是在短的序列前補0,使兩個序列長度一樣,

接著,從後向前遍歷。

此時問題又出現了,就是序列中會出現2的位,

可是在某種程度上,2會影響比大小,怎麼才能避免出2呢?

經過觀察發現,當連續1的個數為奇數時,最後會出現2,偶數則不會,

於是乎,加了乙個判斷,每次遇見一段兒1的時候先判斷奇偶性,

如果是奇數,該位則不處理,直接跳過處理下一位,否則處理方案不變。

so,處理後的兩個字串中一定都是10

且一定不存在連續的1(因為連續的可以組成更大的數),

那麼從高位開始逐位比較,1的權重之和相等時,輸出=,否則輸出對應符號。

其實,並不需要求和,只用找最先出現的兩者對應位置不同的情況就行了,

如果沒有,就是相等了~~~ko.

#include 

#include

using

namespace

std;

const

int maxn = 1e5 + 5;

char a[maxn];

char b[maxn];

// 判斷相連的1的奇偶性

bool judge(char c, int i)

return res % 2;

}int main(int argc, const

char * argv)

for (int i = 2; i < k; i++)

}else

if (lena > lenb)

for (int i = 2; i < k; i++)

}// cout << a << '\n' << b << "\n\n";

bool flag = true;

for (int i = len - 1; i >= 2; i--)

else

if (a[i] == '1' && flag)

}if (a[i] > '0' && a[i - 1] > '0')

}flag = true;

for (int i = len - 1; i >= 2; i--)

else

if (b[i] == '1' && flag)

}if (b[i] > '0' && b[i - 1] > '0')

}// cout << a << '\n' << b << "\n\n";

for (int i = 0; i < len; i++)

else}}

cout

<< "=\n";

return

0;}

51 nod 1491 黃金系統 貢獻

1491 系統 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 q 5 12,在 系統下面a0 a1.an 等於 ni 0ai qn i 其中 ai 是0或者1。現在給出兩個 系統下面的數字,請比較他們的大小。input 單組測試資料。第一行...

黃金系統 51Nod 1419

可以發現q 3 q 2 q 就是個斐波那契數列 和之前做過的1946很像 於是就玄學暴力 各種t。看完題解 覺得很智障。既然是比較兩個數 直接處理兩數之差就好了 具體細節參考上面部落格 include using namespace std typedef long long ll const in...

1491 黃金系統 思維題

q 5 12 在 系統下面a0 a1.an 等於 ni 0ai qn i 其中 ai 是0或者1。現在給出兩個 系統下面的數字,請比較他們的大小。input 單組測試資料。第一行有乙個字串a。第二行有乙個字串b。按照a0到an的順序輸入。他們都是非空串,可能有前導0,並且只有0和1組成,長度不超過1...