在劉汝佳老師的《演算法競賽入門經典(第2版)》52頁例題3-5中看到此題,發現此題並不需要列舉太多,實際上只需要列舉很少的值即可。
例題 3-5 生成元 (digit generator, acm/icpc seoul 2005, uva1583)
如果x加上x的各個數字之和得到y,就說x是y的生成元。給出n(1<=n<=100000),求最小生成元。無解輸出0。例如,n=216,121,2005時的解分別為198,0,1979。
由於每個數字的數字最大為9,那麼m位數字之和最大為9m。假設y是m位數,x的位數必然<=m,假設x也是與y相同的m位數,那麼x與y的最大差值為9m,由x最小值y-9m開始逐個嘗試,最多不超過9*m次即可找到最小x值。根據本題的資料上限,列舉最多不超過54次x值即可。
#include
#include
#include
#include
intmain()
got =0;
// 是否得到解
if(n-
9*m<=
0) x=1;
// 處理n-9*m負值的情況
else x=n-
9*m;
for(
; x(x+sum==n)}if
(got==0)
printf
("%d\n",0
);else
printf
("%d\n"
, x)
;return0;
// 返回
}
最小生成元 java
如果x加上x的各個位數字之和得到y,就說x是y的生成元 給出n,1 n 100000 求最小生成元。無解輸出0.例如,n 216,121,2005時的解分別為198,0,1979。198 1 9 8 216 1979 1 9 7 9 2005 我的思路如下 1.從0找到n所有的數字 2.將這些數字轉...
求解最小生成元
前言 因為看著劉汝佳的演算法書學習的演算法,今天聊聊最小生成元,關於這一點我覺得書上的方法有些不妥,因為就拿出來說說,這個演算法相對還是比較簡單的。最小生成元問題描述 如果x加上x的各個位數字之和得到y,就說x是y的生成元 給出n,1 n 100000 求最小生成元。無解輸出0。例如,n 216,1...
uva 10397 最小生成樹
這道題是最小生成樹樹的變形。題目告訴你在其中已經新增過了一些邊,在剩下的邊中選取若干條使其成為乙個最小生成樹。我記得上一次做真題是遇到類似的問題。我用了prime演算法求解。現在就換用了kruskal演算法。根據查詢選把相應邊合併,這些邊不算入雖小生成樹的權值即可,接下來的就和kruskal演算法一...