Igor has fallen in love with Tanya. Now Igor wants to show his feelings and write a number on the fence opposite to Tanya's house. Igor thinks that the larger the number is, the more chance to win Tanya's heart he has.
Unfortunately, Igor could only get v liters of paint. He did the math and concluded that digit d requires ad liters of paint. Besides, Igor heard that Tanya doesn't like zeroes. That's why Igor won't use them in his number.
Help Igor find the maximum number he can write on the fence.
The first line contains a positive integer v (0 ≤ v ≤ 106). The second line contains nine positive integers a1, a2, ..., a9 (1 ≤ ai ≤ 105).
Print the maximum number Igor can write on the fence. If he has too little paint for any digit (so, he cannot write anything), print -1.
5 5 4 3 2 1 2 3 4 5
55555
2 9 11 1 12 5 8 9 10 6
33
0 1 1 1 1 1 1 1 1 1
-1
题目大意:
每个数字对应消耗的油桶数已知。
我们最多只能使用V桶油漆,问最大能够组成的数字是什么?
思路:
1、首先,我们能够很简单的确定得到的数字的长度=max(v/a【i】)(1<=i<=9)
2、此时我们如果确定了其长度之后,还要确定这么长要用哪个数字,考虑这样一个问题:
①我们确定了长度之后,可能会有剩余的钱,那么这个剩余的桶数和确定下来这个数字的桶数的加和数可能替换为更大的数字。那么我们确定下来的这个数字,应该取最小。
②那么我们确定了当前数字的长度和所取数字之后,记录下来此时剩余的桶数。那么接下来我们从最高位开始判断,能否将最高位的这个数变成更大的数。即若当前剩余的桶数+当前数的桶数>=a【i】,那么我们就可以将这个数变成i这个数(i需要大于当前这个数才行。要不然就没有意义了)。
③一直判断下去,如果不能替换了,那么就输出确定下来的那个数字即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[15];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=9;i++)
{
scanf("%d",&a[i]);
}
int maxlen=0;
int maxnum=0;
int yu=0;
for(int i=1;i<=9;i++)
{
if(n/a[i]>maxlen)
{
maxlen=n/a[i];
maxnum=i;
yu=n%a[i];
}
}
if(maxlen==0)printf("-1");
for(int i=0;i<maxlen;i++)
{
int j;
for(j=9;j>maxnum;j--)
{
if(a[j]-a[maxnum]<=yu)
{
yu-=a[j]-a[maxnum];
break;
}
}
printf("%d",j);
}
printf("\n");
}
}