
WA Code:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <deque>
#include <iostream>
#include <ostream>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const ll N = 155, M = 1e4 + 5;
struct card {
ll w, d, t;
card() { w = d = t = -1; }
};
struct node {
ll ind;
ll val;
};
ll s[N];
ll dp[N];
card cards[M];
ll cost[N][M];
deque<node> q[M];
ll n, m, c;
int main() {
cin >> n >> m >> c;
for (ll i = 1; i <= n; i++) {
cin >> s[i];
}
for (ll i = 0; i < m; i++) {
cin >> cards[i].w >> cards[i].d >> cards[i].t;
}
for (ll i = 1; i <= n; i++) {
for (ll j = 0; j < m; j++) {
cost[i][j] = cost[i - 1][j] + max(s[i] - cards[j].t, 0ll) * c;
}
}
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (ll j = 0; j < m; j++) {
q[j].push_back({0, dp[0] - cost[0][j]});
}
for (ll i = 1; i <= n; i++) {
for (ll j = 0; j < m; j++) {
while (q[j].front().ind < i - cards[j].d) {
q[j].pop_front();
}
dp[i] = min(dp[i], q[j].front().val + cost[i][j] + cards[j].w);
}
dp[i] = min(dp[i], dp[i - 1] + s[i] * c);
for (ll j = 0; j < m; j++) {
while (!q[j].empty() && q[j].back().val > dp[i] - cost[i][j]) {
q[j].pop_back();
}
q[j].push_back({i, dp[i] - cost[i][j]});
}
}
cout << dp[n] << endl;
return 0;
}
这里思路哪里有问题?