UVa1583 最小生成元 只需列舉幾十次的演算法

2021-10-07 14:52:00 字數 801 閱讀 2616

在劉汝佳老師的《演算法競賽入門經典(第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演算法一...