CodeForces-349#B 题解
正文
算法:贪心
首先挑代价最小的 \(a_i\),最后得到的数字越长越好。
其次可能 \(v\) 还会有剩余,从高位到低位,尝试用更大的数字代替原本的数字。
其实就是贪心。
#include<iostream>
#define int long long
#define fr(x,j) for(int i=x;i<=j;i++)
#define fs(x,j) for(int i=x;i>=j;i--)
using namespace std;
int a[10],v,m[1000005],t=1;
void is_no_ans(){
bool no_ans=1;
fr(1,9)if(a[i]<v)no_ans=0;
if(no_ans)cout<<-1,exit(0);
}
signed main(){
cin>>v; fr(1,9)cin>>a[i];
is_no_ans();
int mp,mx=LLONG_MAX;
fr(1,9)if(mx>=a[i])mx=a[i],mp=i;
while(v>=mx)m[t]=mp,t++,v-=mx;
t--; int k=t;
if(v)fs(t,1){
if(v<=0) break;
fs(9,1)if(v+mx>=a[i]&&i>mp)
{m[k--]=i,v=v+mx-a[i];goto pass;}
pass:;
}
fs(t,1)cout<<m[i];
}

浙公网安备 33010602011771号