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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

CodeForces - 1373E Sum of Digits(贪心)

發(fā)布時(shí)間:2024/4/11 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1373E Sum of Digits(贪心) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:設(shè) f( x ) 為 x 的數(shù)位之和,給出一個(gè) n 和一個(gè) k ,求??的最小 x ,若不存在,輸出 -1

題目分析:因?yàn)?n 和 k 比較小,所以可以打表,當(dāng) k 為 0 的時(shí)候,顯然是 r + 99...999 是最優(yōu)的,其中 r = n%9,當(dāng) k 為 1 的時(shí)候,打表的時(shí)間復(fù)雜度是 sqrt( 1e16 ) * 8 ,也就是將近 1e9 ,本地可能繃不住,所以可以打到 1e7 左右,然后自己找找規(guī)律補(bǔ)齊剩下的幾項(xiàng)就好了,剩下的時(shí)間復(fù)雜度分別就是?,之類的了,本地輕輕松松搞定

然后說(shuō)一下正解,因?yàn)?k 最大只有 9 ,比較顯然的一點(diǎn)就是,至多會(huì)進(jìn)位一次,因?yàn)槲覀冐澬牡牟呗允禽^低位都放置 9 ,所以個(gè)位的進(jìn)位會(huì)涉及到更高位的連續(xù)進(jìn)位,這樣我們不妨設(shè)我們最后構(gòu)造出來(lái)的數(shù)為 r + 99...999 + 8 + 99..999 + x ,我們將需要構(gòu)造的數(shù)分為了五段,因?yàn)檎f(shuō)過(guò)了,為了貪心,所以低位需要盡量放 9 ,我們?cè)O(shè) x 左邊的第一堆 9 的個(gè)數(shù)為 num_9,又因?yàn)槿绻婕斑M(jìn)位的話,會(huì)導(dǎo)致連續(xù)進(jìn)位,所以我們?cè)?num_9 個(gè) 9 之前,放置了一個(gè) 8 ,到此停止連續(xù)進(jìn)位,剩下的再按照當(dāng) k = 0 時(shí)貪心放置就好了

因?yàn)樽疃嘀挥?1e16,換句話說(shuō) num_9 最多只有 16 ,而個(gè)位的 x 也最多只有 9 種取值,我們可以暴力枚舉 x 和 num_9 ,然后計(jì)算此時(shí)貪心放置得到的最小值,就好了

代碼:
?

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=510;int n,k;LL cal(int last,int num_9) {int num=n;for(int i=0;i<=k;i++){if(last+i<=9)num-=last+i+9*num_9;elsenum-=last+i-9;}if(num<0||num%(k+1)!=0)//如果剩下的數(shù)小于0了或者不足以恰好分為k+1份,則此時(shí)無(wú)解return inf;num/=k+1;LL ans=0;if(num<9)//按照k=0時(shí)貪心分配即可ans=num;else{num-=8;//別忘了需要放上一個(gè)8用來(lái)截?cái)噙B續(xù)的9ans=num%9;for(int i=1;i<=num/9;i++)ans=ans*10+9;ans=ans*10+8;}for(int i=1;i<=num_9;i++)ans=ans*10+9;ans=ans*10+last;return ans; }LL solve() {LL ans=inf;for(int i=0;i<10;i++)//枚舉個(gè)位的xfor(int j=0;j<=16;j++)//枚舉x前有多少個(gè)9:num_9ans=min(ans,cal(i,j));if(ans==inf)ans=-1;return ans; }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%d%d",&n,&k);printf("%lld\n",solve());}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的CodeForces - 1373E Sum of Digits(贪心)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。