2025/5/17 模拟赛 T4 题解
题解
题面描述
有
sol
若随意合并,则合并后可产生的物体过多,无法处理。所以我们需要想办法让可更新答案的物体在一个可以接受的范围内。不难发现只有
CODE
#include<bits/stdc++.h>
using namespace std;
int n, m, v[10], val[3005], ans[3005];
int main() {
// freopen("stone.in", "r", stdin);
// freopen("stone.out", "w", stdout);
int t;
scanf("%d", &t);
while(t--) {
memset(val, -0x3f, sizeof(val)), memset(ans, 0, sizeof(ans));
for(int i = 0; i < 10; ++i) scanf("%d", v + i);
scanf("%d%d", &n, &m);
for(int i = n; i; --i) {
int a, b;
scanf("%d%d", &a, &b);
val[a] = max(val[a], b);
}
for(int i = 1; i <= m; ++i)
for(int j = 1; i + j <= m && j <= i; ++j)
val[i + j] = max(val[i + j], val[i] + val[j]);
for(int i = m; i; --i) {
if(val[i] > 0) {
int now = (val[i] * 10 - 1) / i;
for(int j = 0; j + i <= m; ++j) ans[i + j] = max(ans[i + j], ans[j] + i * v[now]);
}
}
printf("%d\n", ans[m]);
}
return 0;
}