1. 程式人生 > >Project Eular-71-Ordered fractions

Project Eular-71-Ordered fractions

ACM模版

描述

這裡寫圖片描述

題解

看到這個題,想到有一個叫做 SternBrocot 樹的東西,是專門用來拆分 01 所有真分數的,在《具體數學》上有講,但是書沒拿,也就能去仔細回顧一下了。

這個題只要答案,所以就算純暴力也是可以搞定的,O(n2) 列舉判斷,不過這樣不太優雅,所以考慮可以降低到 O(n),因為我們要找小於 37 的最簡分數中最大的那個,也就是取最大的 pq<37,所以我們可以列舉 q,然後令 p=3q17,這樣就可以保證是小於 37,然後取最大即可。

最後結果為

428570999997,但是提交了很多次都是錯的,然後認識了一個單詞叫做 numerator

程式碼

#include <iostream>

using namespace std;

/*
 *  428570/999997
 *  a/b 為 ans,初始 0/1
 *  設 p/q < 3/7,則 7p < 3q
 *  分母減小,7p < 3q - 1,則 p 最大為 floor((3q - 1) / 7)
 *  列舉 q,取小於 3/7 的最大 p/q 給 a/b
 */
void solve(int x, int y, int &a, int
&b, int d) { for (int q = 2; q <= d; q++) { int p = (int)((x * q - 1) / y); if (a * q < b * p) { a = p; b = q; } } } int main() { int a = 0, b = 1, d = 1000000; int x = 3, y = 7; solve(x, y, a, b, d); printf("%d/%d\n"
, a, b); return 0; }