Codeforces 349B Color the Fence【贪心+思维】

B. Color the Fence
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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
Input
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桶油漆,问最大能够组成的数字是什么?


思路:


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");
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值