(简单贪心)牛客-填数字

点击打开问题链接

题目描述

每填写一次数字(1≤ i≤9)需要花费a i枚金币,托米总共有n枚金币.
托米想知道他能得到的最大数字是多少.
如果填不了请输出-1。
不需要用完所有金币

输入描述:

第一行一个数字n,表示金币总数.
第二行9个正整数,第i个数字表示填写一次数字i所需要的金币数.

输出描述:

输出满足条件的最大数字.
示例1

输入

复制
5
5 4 3 2 1 2 3 4 5

输出

复制
55555
示例2

输入

复制
2
9 11 1 12 5 8 9 10 6

输出

复制
33
示例3

输入

复制
0
1 1 1 1 1 1 1 1 1

输出

复制
-1

#include <iostream>
#include <string>
#include <cstdio>

using namespace std;

int main()
{
    int a[10];
    string b;
    int n, i, max, pos, v = 1, j, min = 0x3f3f3f3f;
    char c;
    cin >> n;
    for (i = 0; i < 9; i++)
    {
        cin >> a[i];
        if (a[i] <= min)
        {
            min = a[i];   //min 花费最少
            pos = i + 1; //pos 数字
        }
    }
    max = n / min;    //多少个最小花费的数,也就是组成的最大数应该有max位!!!
    c = pos + '0';    //c是花费最少的那个坐标值,因为要使得组成的数字最大,首先考虑的是位数最多
    b.assign(max, c); //先给b赋值 max个c

    n = n % min;      //n 钱剩余数
    //下面考虑这个max位的数能不能更大,那也只用考虑坐标比最小数坐标大的数
    //只有最小数后面的 数的坐标 才可能让这个数变大呀~~
    //因为要尽可能的大,所以字符串 b 从前面开始遍历 能否把某一位增大
    //原始序列 a 从后面最大的坐标开始,到 最小花费的坐标,
    for (j = 0; j < max; j++)
    {
        for (i = 8; i >= pos; i--)
        {
            if((min+n) >= a[i])  //如果最小的花费 + 剩余的钱 >= i 所需要的钱,也就是可以替换
            {
                b[j] = i + 1 + '0';  //替换 b 的当前位
                n = n + min - a[i];  // 更新剩余的钱 n
                break;              // 可以开始判断 b 的下一位了。
            }
        }
    }
    if (b.empty())
        cout << "-1" << endl;
    else
        cout << b << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41003528/article/details/80711725