提交时间:2026-05-15 15:22:44
运行 ID: 88663
// 算法竞赛->第2章->2.7 #include <cstdio> #include <algorithm> #include <cstring> #define min(a, b) (((a) < (b)) ? (a) : (b)) int pos[210]; int a[210]; bool vis[100010]; int dp[100010]; int main() { int L; int S, T, M; scanf("%d", &L); scanf("%d %d %d", &S, &T, &M); int t = S * T; for(int i = 1; i <= M; i++) scanf("%d", &pos[i]); std::sort(pos + 1, pos + M + 1); if(S == T) { int cnt = 0; for(int i = 1; i <= M; i++) if(pos[i] % S == 0) cnt++; printf("%d", cnt); return 0; } for(int i = 1; i <= M; i++) { int dis = pos[i] - pos[i - 1]; if(dis >= t) dis = t; a[i] = a[i - 1] + dis; vis[a[i]] = true; } L = a[M] + t; memset(dp, 0x3f, sizeof(dp)); dp[0] = 0; for(int i = 1; i <= L; i++) for(int j = S; j <= T; j++) { if(i - j >= 0) { if(vis[i]) dp[i] = min(dp[i - j] + 1, dp[i]); else dp[i] = min(dp[i - j], dp[i]); } } int ans = 1e9; for(int i = a[M]; i <= L; i++) ans = min(ans, dp[i]); printf("%d", ans); return 0; }