「ABC257E」 Addition and Multiplication 2

题意

最开始有一个为零的数 \(x\)

你可以花费一定代价在 \(x\) 后面加入一个 \(0\sim9\) 的数字。

给定你拥有的钱和加入每一个数字的代价,求能组合出的最大数。

分析

考虑贪心。

首先,不管是什么数字,较长的数字肯定比较短的数字大。

所以找出代价最小的数,先求出最大长度。

然后考虑用更大的数字替换一些小的数字。

从最左边开始逐位替换,若剩余的钱可以替换就替换,每次都选择最大的。

注意在判断和扣钱时加入之前用的最小值。

使用 string 会方便一些,线性时间可过。

Code

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define dbg(x) cout<<#x<<": "<<x<<"\n"
// static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
// #define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
// #define putchar(x) (p3-obuf<1000000)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
inline void write(ll x){if(!x){putchar(48);putchar('\n');return;}ll top=0,s[40];if(x<0)x=-x,putchar(45);while(x)s[top++]=x%10^48,x/=10;while(top--)putchar(s[top]);putchar('\n');}
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());
const ll mod=1e9+7,maxn=1e5+5,maxt=505;
ll n,c[10]={INT_MAX},mn;
string ans;
inline void solve(){
    n=read();
    for(ll i=1;i<=9;++i){
        c[i]=read();
        if(c[i]<c[mn])mn=i;
    }
    for(ll i=1;i<=n/c[mn];++i){
        ans.push_back(mn+'0');
    }
    n-=ans.size()*c[mn];
    for(ll i=0;i<ans.size();++i){
        for(ll j=9;j>=1;--j){
            if(n+c[mn]>=c[j]){
                n-=c[j]-c[mn],ans[i]=j+'0';break;
            }
        }
    }
    cout<<ans;
}
signed main(){
    ll t=1;
    while(t--){
        solve();
    }
    // fwrite(obuf,p3-obuf,1,stdout);
    return 0;
}
posted @ 2024-12-20 15:20  run-away  阅读(6)  评论(0)    收藏  举报