acm模版
拿到這種題,不用多想,先列舉一些q^i
,可以發現在某種程度上其符合斐波那契數列……
q^0
用a
表示,q^1
用b
表示,
我們可以發現,每乙個數都可以用xa + yb
表示,
而這裡的x和y在一定程度上都符合斐波那契數列。
這也就給了我初始的想法,能否遍歷一遍,
遇見連續兩位都是1
的時候就減去這兩個1
繼而在高位添1
,
就著這個想法嘗試,這時注意到n-i
的問題,
於是乎,想了乙個辦法就是在短的序列前補0,使兩個序列長度一樣,
接著,從後向前遍歷。
此時問題又出現了,就是序列中會出現2
的位,
可是在某種程度上,2
會影響比大小,怎麼才能避免出2
呢?
經過觀察發現,當連續1
的個數為奇數時,最後會出現2
,偶數則不會,
於是乎,加了乙個判斷,每次遇見一段兒1
的時候先判斷奇偶性,
如果是奇數,該位則不處理,直接跳過處理下一位,否則處理方案不變。
so,處理後的兩個字串中一定都是1
和0
,
且一定不存在連續的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...