Description
托米发现了一种新的游戏–填数字!
每填写一次数字 ( 1 ≤ i ≤ 9 ) (1\le i\le 9) (1≤i≤9)需要花费 a i a_i ai枚金币,托米总共有 n n n枚金币.
托米想知道他能得到的最大数字是多少.
如果填不了请输出 − 1 -1 −1。
不需要用完所有金币
Input
第一行一个数字
n
n
n,表示金币总数.
第二行
9
9
9个正整数,第
i
i
i个数字表示填写一次数字
i
i
i所需要的金币数.
( 0 ≤ n ≤ 1 0 6 , 1 ≤ a i ≤ 1 0 5 ) (0\le n\le 10^6,1\le a_i\le 10^5) (0≤n≤106,1≤ai≤105)
Output
输出满足条件的最大数字.
Sample Input
5
5 4 3 2 1 2 3 4 5
Sample Output
55555
Solution
贪心,选择最便宜且最大的数字填,如果有剩余金币则尽可能把高位数字变大
Code
#include<cstdio>
using namespace std;
int n,a[10],ans[1000005];
int main()
{
scanf("%d",&n);
int pos=1;
for(int i=1;i<=9;i++)
{
scanf("%d",&a[i]);
if(a[i]<=a[pos])pos=i;
}
if(n<a[pos])printf("-1\n");
else
{
int m=n/a[pos];
for(int i=1;i<=m;i++)ans[i]=pos;
n%=a[pos];
int j=1;
while(n)
{
int flag=0;
for(int i=9;i>pos;i--)
{
if(a[i]-a[pos]<=n)
{
flag=1;
n-=a[i]-a[pos],ans[j++]=i;
break;
}
}
if(!flag||j>m)break;
}
for(int i=1;i<=m;i++)printf("%d",ans[i]);
printf("\n");
}
return 0;
}