20111114

ACM 138 Street Numbers

直接做會算到天荒地老,第7組電腦跑了一個小時還跑不出來,
暴力是不行滴!

google或是看uva討論板,都是寫些我看不懂的算則(遮臉),
最後在這裡
終於看到一個看得懂的算則了。
很直觀的想法,但我竟然沒想到 orz。

大意就是門牌號碼i往上遞增時,左邊的總數加第i - 1個號碼,
右邊的總數先減去第i個號碼,再從j + 1開始往上加,直到找到滿10組解。
(ps 要先找到第一組解才行)

/* ACM 138 Street Numbers
 * mythnc
 * 2011/11/14 07:54:27   
 * run time: 0.3
 */
#include <>

int main(void)
{
    long long i, j, pre, next;
    int count;

    printf("%10d%10d\n", 6, 8);
    pre = next = 15;
    j = 9;
    for (i = 7, count = 1; count < 10; i++) {
            pre += i - 1;
            next -= i;
        for (; next < pre; j++)
            next += j;
        if (next == pre) {
            printf("%10lld%10lld\n", i, j - 1);
            count++;
        }
    }
    return 0;
}

沒有留言: