Color the Fence
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.
Input
The first line contains a positive integer v (0 ≤ v ≤ 106). The second line contains nine positive integers a1, a2, …, a9 (1 ≤ ai ≤ 105).
Output
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.
Examples
Inpu
5
5 4 3 2 1 2 3 4 5
Output
55555
Input
2
9 11 1 12 5 8 9 10 6
Output
33
Input
0
1 1 1 1 1 1 1 1 1
Output
-1
大意:给了v升油漆,9个数,涂每个数需要相应数量的油漆,问可以涂出的最大数是多少。
思路: 一个数必然是越长越大,就是位数越多越大,那么我们不就可以直接找出消耗油漆最少的那个数,完了一直涂这个数不就好了,但是这样是存在问题的,就是说我们的油漆可能不会正好用完,是不是会存在这么一种情况,就是我剩下的油漆加上一个最小的油漆消耗可以换一个更大的数,那显然这个数要比所有的都是最小油漆消耗量的数要大。我们发现当找到最小油漆消耗的时候所求数的最大位数也确定了。那我们就可以依托这个条件把这种情况包含进去,操作是这样的,我们求出最大位数,从后往前每次用总油漆先减一个,然后看剩下的位数是否和最大位数减一相等,直到进行完最大位数次。
上代码
#include <iostream>
using namespace std;
int a[11];
int v;
int main()
{
cin >> v;
int minn = 9999999;
for(int i = 1; i <= 9; i++)
{
cin >> a[i];
if(a[i] < minn)
minn = a[i]; // 最小值
}
if(v < minn)
{
cout << "-1" << endl;
return 0;
}
int kmax = v / minn; //确定的位数
while(true)
{
for(int i = 9; i >= 1; i--)
{
if(v < a[i])
continue;
if(((v-a[i])/minn)==(kmax-1)) //每次看位数是否相等
{
cout << i;
v -= a[i];
kmax--;
break;
}
}
if(kmax == 0) //输出所有的位数后结束
break;
}
return 0;
}