CodeForces 349B Color the Fence

大家好,我是煞笔。

今天的比赛,开局38分钟写到第一,然后就卡在这题……
真的我觉得我自己挺傻的……事实也是如此,一直卡着之后就去入了另一个弓形矩阵的大坑……还以为要一血来着……

题意:
有 n 块钱,1-9 一共9个数字,每个数字花费确定,要你求出最大的值。

思路
毫无疑问,位数是最重要的。我居然把这个加入了动态的思路上,其实位数应该是从一开始就该确定的。
就是 n / 最小的花费。
剩下的多余的前用来对每一个数进行更换,优先从最左边开始,更换最大的。

AC Code

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>

#define each(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define reach(i, n) for (int(i) = n - 1; (i) >= 0; (i)--)
#define range(i, st, en) for (int(i) = (st); (i) <= (en); (i)++)
#define rrange(i, st, en) for (int(i) = (en); (i) >= (st); (i)--)
#define fill(num, ary) memset((ary), (num), sizeof((ary)))

using namespace std;

const int inf = 0x3f3f3f3f;

int ary[15];

int main()
{
    int tot, mn = inf;
    scanf("%d", &tot);
    range(i, 1, 9)
    {
        scanf("%d", ary + i);
        mn = min(mn, ary[i]);
    }
    if (tot < mn) {
        puts("-1");
        return 0;
    }
    int max_digit = tot / mn, l = tot % mn;
    each(i, max_digit)
    {
        bool flag = false;
        rrange(j, 1, 9)
        {
            if (mn + l >= ary[j]) {
                l = mn + l - ary[j];
                putchar(j + '0');
                flag = true;
                break;
            }
        }
        if (!flag)
            putchar(mn + '0');
    }
    return 0;
}