蓝桥杯红绿灯
作者:
CZL
,
2022-05-12 21:45:32
,
所有人可见
,
阅读 289
import java.util.*;
import java.io.*;
public class Main {
static int N = 1010;
static long INF = Long.MAX_VALUE / 10;
static long f[][] = new long[N][N];
static int a[][] = new int[N][3];
static int n, m, k, v;
static long get(long t, int p) {
if(p == m)
return 0;
long lun = a[p][1] + a[p][2];
t %= lun;
return t >= a[p][1] ? lun - t : 0;
}
static long getRange(long t, int l, int r) {
for(int i = l + 1; i <= r; i ++ ) {
t += (a[i][0] - a[i - 1][0]) * v;
t += get(t, i);
}
return t;
}
public static void main(String[] args) {
IR sc = new IR();
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
v = sc.nextInt();
for(int i = 1; i <= m; i ++ ) {
for(int j = 0; j < 3; j ++ ) {
a[i][j] = sc.nextInt();
}
}
Arrays.sort(a, 1, m + 1, (o1, o2) -> o1[0] - o2[0]);
a[ ++ m][0] = n;
for(int i = 1; i <= m; i ++ ) {
for(int j = 0; j <= i; j ++ ) {
f[i][j] = INF;
long tem = f[i - 1][j] + (a[i][0] - a[i - 1][0]) * v;
f[i][j] = tem + get(tem, i);
if(j == 1) {
f[i][j] = Math.min(f[i][j], f[i - 1][j - 1] + get(f[i - 1][j - 1], i));
} else if(j > 1){
if(i - k > 0) {
f[i][j] = Math.min(f[i][j], f[i - k][j - 1] + getRange(f[i - k][j - 1], i - k, i - 1));
}
}
}
for(int j = i + 1; j <= m; j ++ )
f[i][j] = INF;
}
long res = INF;
for(int i = 0; i <= m; i ++ ) {
res = Math.min(res, f[m][i]);
}
System.out.println(res);
}
}
class IR {
BufferedReader br;
StringTokenizer st;
IR() {
br = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
return false;
}
}
return true;
}
String next() {
if(hasNext())
return st.nextToken();
return null;
}
int nextInt() {
return Integer.parseInt(next());
}
}