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];
}

完结!!

posted @ 2023-02-15 17:41  IOIAK_wanguan  阅读(48)  评论(0)    收藏  举报