日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】

發布時間:2023/12/3 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


大意

如果一個數每一位都小于k那么這個數是好數。給出n和k,求1-n里有多少個好數。


解題思路1

將起改為一個k+1進制的數,那么每次加1后這個數都是好數。然后判斷一下是否大于n(十進制的情況下)

解題思路2

數位dp,時間復雜度O(n的位數):
f[i]表示后i位數沒有被前面的數影響的好數數量
g[i]表示后i位數被前面的數影響的好數數量
n[i]表示n的第i位數
然后動態轉移方程

f[i]=f[i?1]?(k+1)f[i]=f[i?1]?(k+1)
g[i]=f[i](n[i]>k)g[i]=f[i](n[i]>k)
g[i]=g[i?1]+f[i?1]?n[i](n[i]<=k)g[i]=g[i?1]+f[i?1]?n[i](n[i]<=k)


代碼1

#include<cstdio> using namespace std; int a[9],maxs[9],w,m,s,n; bool add() {bool flag=0;a[1]++;//加1for (int i=1;i<=w;i++){if (a[i]>m){a[i+1]++;a[i]=0;//進位}if (a[i]>maxs[i]) flag=true;else if (a[i]<maxs[i]) flag=false;//判斷大小}if (a[w+1]!=0) return true;return flag; } int main() { scanf("%d%d",&n,&m);a[1]=0;for (int i=n;i;i/=10){maxs[++w]=i%10;//計算}while (true){if (add()) break;s++;}printf("%d",s); }

代碼2

#include<cstdio> using namespace std; int n,num,g,f,k; int main() {scanf("%d%d",&n,&k);f=1;g=1;for (n=n;n;n/=10){num=n%10;if (num>k) g=(k+1)*f;else g+=num*f;f=(k+1)*f;//動態轉移}printf("%d",g-1); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【2018.4.7】模拟赛之一-ssl2382 K好数【数位dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。