D. Smithing Skill:
题目大意:
思路解析:
可以发现最好的策略,一定是先利用锻造并融化后损失最小的来获取经验。这个贪心是可以证明的。那我们发现a的范围是1e6,那么如果C大于最大的ai,那我们可以选择一个最小损失的方案一直执行让他小于最大的ai,小于ai后,这个数据范围可以发现,我们可以利用dp来得到1e6范围的所有答案,那么这道题就完成了
代码实现:
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<int> a(n), b(n), d(1e6 + 5, 1e7), dp(1e6 + 5);
int s = 0;
for(int i = 0; i < n; i++){
std::cin >> a[i];
s = std::max(s, a[i]);
}
for(int i = 0; i < n; i++){
std::cin >> b[i];
d[a[i]] = std::min(d[a[i]], a[i] - b[i]);
}
for(int i = 1; i <= 1e6; i++){
d[i] = std::min(d[i], d[i-1]);
}
for(int i = 1; i <= 1e6; i++){
if (d[i] == 1e7) continue;
dp[i] = std::max(dp[i], dp[i - d[i]] + 1);
}
i64 ans = 0;
int c;
for(int i = 0; i < m; i++){
std::cin >> c;
if (c > s){
int res = (c - s) / d[s] + 1;
c -= res * d[s];
ans += res;
}
ans += dp[c];
}
std::cout << ans * 2 << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t = 1;
//std::cin >> t;
while (t--) {
solve();
}
return 0;
}