题解:CF846B Math Show

· · 题解

题目传送门

思路:

考虑用模拟得到最优的方式。首先枚举可以完成 i 个大的任务,然后循环找到从时间到最大的,其实就是暴力求解,数据不大。

AC Code

#include<bits/stdc++.h>
#define int long long//注意不开long long见祖宗
using namespace std;
int a[45], n, k, m;
signed main() {
    while (cin >> n >> k >> m) {
        int sum = 0;
        for (int i = 1; i <= k; i++) {
            cin >> a[i],
                sum += a[i];
        }
        stable_sort(a + 1, a + k + 1);//稳定排序一下
        int ans = 0;
        for (int i = 0; i <= n; i++) {
            if (m < i * sum) break;
            int cnt = m - i * sum, t = i * (k + 1);
            for (int j = 1; j < k; j++) {
                for (int p = 1; p <= n - i; p++) {
                    if (cnt >= a[j]) t++,
                    cnt -= a[j];
                }
            }
            ans = max(ans, t);
        }
        cout << ans << "\n";
    }
    return 0;
}