大家好,我是煞笔。
今天的比赛,开局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;
}