經典的數1問題

2021-07-28 02:52:38 字數 2100 閱讀 8211

程式設計之美裡有一道經典題目:從1~n的數字裡一共出現過多少次數字「1」。

之前自以為看懂了結果在牛客網上做到一道類似的題完全過不去,就把這道題徹徹底底分析一下。

牛客網原題:

牛牛新買了一本演算法書,演算法書一共有n頁,頁碼從1到n。牛牛於是想了乙個演算法題目:在這本演算法書頁碼中0~9每個數字分別出現了多少次?

輸入描述:

輸入包括乙個整數n(1 ≤ n ≤ 1,000,000,000)

輸出描述:

輸出包括一行10個整數,即0~9這些數字在頁碼中出現的次數,以空格分隔。行末無空格。

輸入例子:

999輸出例子:

189 300 300 300 300 300 300 300 300 300

這題的思路的概括是:按位數某個數字出現過多少次。也就是說,固定某一位上的某個數,看看此時有幾種情況。

舉個栗子:

對統計1~785012中5出現的個數

我們先考慮5在低位第三位出現的次數,我們就將第三位固定為5:***5xx。

此時,問題就轉化為,「x」處一共有多少種組合方式

高位的3位可以從000到785之間,低位的2位可以從00到99之間。

但是,當高3位為785時,7855xx無論如何都超過了785012,因此,高三位可以選擇的只有000~784(共785個數字),高三位和低二位一共有785*100種組合方式。

我們再考慮5在低位第四位出現的次數,我們就將第四位固定為5:xx5***。

與前面相同,高位的二位可以從00到78之間,低位的三位可以從000到999之間。

當高位是00到77時,與前面一種情況是相同的,一共可以組合出78*1000種情況。

當高位是78時,785***就有超過785012的可能了,後三位的選擇侷限在000到012之間,共13中情況。

兩者結合就是:78*1000+13

最後考慮5在低位第5位出現的次數,我們就將第五位固定為5:x5***x。

與前面相同,最高位可以從0取到7,低四位可以從0000取到9999.

當最高位為0到6時,與第一種情況相同,一共可以組合出7*10000中情況。

當高位是7時,與前面的情況不同的是,75***x是不會越界的,後四位可以從0000取到9999,所以可以組合出10000中情況。

兩者結合就是:7*10000+10000

設我們討論的當前位的值為a,我們統計的數字為b,我們前面討論的三種情況,其實分別是:a小於b時,a等於b時,a大於b時。

上述的計算方式對於1~9是通用的,可以寫成這樣的函式:

long

int cal(long

long

int page, int data)

return num;

}

但是,當統計0的個數時,情況又有所不同。還用785012討論,如果我們要統計低位低2位出現0的次數,按照前面的方法,我們可能把00000x討論進來,認為這也是第二位出現0的情況,但是這個數只能表示為x,它的第二位根本不存在。

因此,針對0這種情況,我們需要單獨討論,只需要分成兩類,不可能存在當前位小於0的情況,不過每次高位的取值要把全0的情況剔除

**可以這樣寫:

long

int cal0(long

long

int page)

return num;

}

牛客網那題完整的解題**是:

#include

using

namespace

std;

long

int cal(long

long

int page, int data)

return num;

}long

int cal0(long

long

int page)

return num;

}int main()

經典迷宮問題1

下面給出迷宮問題的乙個直觀感受圖,下圖中棕色代表通道阻塞,白色代表可用通道,紅色代表起始位置,綠色代表當前位置,黃色代表出口。迷宮1 首先將入口設為當前位置 然後從當前位置出發,按照固定順序 例如 右左上下順序 探測第乙個可用下乙個單元,然後將這下乙個單元設為當前單元,重複探測,直至遇到出口 如果探...

DP經典問題,數塔

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?dp問題一般都是從後向前,後文有從前向後的動態規劃 分析 因為要找到最大值的連線,我們可以從倒數第二行開始,在2時可以選擇19和7,...

問題 A 例題1 數的劃分

題目描述 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入n,k 6輸出 乙個整數,即不同的分法 樣例輸入 7 3樣例輸出 4題目型別 dfs,求分發的種類 思...