暴力是不行滴!
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;
}
沒有留言:
張貼留言