五花八门
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5, inf = 0x3f3f3f3f;
int n, d, v[N+10], a[N+10];
int Max, Min, sum[N+10];
int num[N+10];
int find(int x, int y, double now) {
y += now*d;
for(int i = n; i > x; i--) {
if(sum[i] - sum[x] <= y) {
return i;
}
}
return 0;
}
int dfs(int x, double now) {
if(x == n) return 0;
Max = ceil(1.0 * sum[n]-sum[x]/d - now);
Min = ceil(1.0 * v[x]/d - now);
int ans = inf;
for(int i = Min; i <= Max; i++) {
int S = find(x, i*d, now);
if(S) {
int k = i*a[x] + dfs(S, now + i - (1.0*(sum[S]-sum[x])/d));
ans = min(ans, k);
}
}
if(ans == inf) ans = -1;
return ans;
}
int main() {
cin >> n >> d;
for(int i = 1; i < n; i++) {
cin >> v[i];
sum[i+1] = sum[i] + v[i];
}
for(int i = 1; i <= n; i++) cin >> a[i];
cout << dfs(1, 0);
return 0;
}
帮帮我吧!