51nod 1385 貪心 構造

2022-10-11 07:12:15 字數 880 閱讀 1594

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 難度:5級演算法題

收藏關注給定乙個n,要求找出乙個最短的字串s,使得所有1到n的整數都是s的子串行。

比如n=10,那麼s=」1234056789」的時候,是滿足條件的。這個時候s的長度是10。

現在給出乙個n,要求輸出最短s的長度。

input

第1行:給出乙個整數n (1<=n<=1e10000)。
output

輸出最短s的長度
input示例

10
output示例

10

不難發現最優的方法就是 12345678901234567890123456789......如此往復,關鍵就是找準每一位最高貢獻到那個數字使得1--這個數字全能表示出來,找規律發現就是n個後面那個數字組成的數

再減去一就是這一位能表示到的最大的數。

n位數一定能表示所有n-1位數,所以ret=(n-2)*10+9;

再從最高位考慮,只剩下兩個數,到s[0]/s[0]+1 ,讓n與最後乙個迴圈節迴圈到到s[0]能表示的極限作比較,如果n更大就ret+=s[0]-'0'+1;否則ret+=s[0]-'0';

1 #include2

using

namespace

std;

3char s[10015];4

intf()

9 ret=(n-2)*10+9+s[0]-'0'

;10for(int i=0;ii)

15if(s[i]-'

0'>r)19}

20return

ret;21}

22int main()

51Nod 1385 湊數字(思維)

給定乙個n,要求找出乙個最短的字串s,使得所有1到n的整數都是s的子串行。比如n 10,那麼s 1234056789 的時候,是滿足條件的。這個時候s的長度是10。現在給出乙個n,要求輸出最短s的長度。input 第1行 給出乙個整數n 1 n 1e10000 output 輸出最短s的長度 sam...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51Nod 排隊接水 貪心

n n 個人一起排隊接水,第 i role presentation i i個人需要b i b i 的時間來接水。1 n 1000 1 n 1000 0 b i 1000 0 b i 1000 同時只能有乙個人接水,正在接水的人和沒有接水的人都需要等待。完成接水的人會立刻消失,不會繼續等待。你可以決...