| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 88663 | sh25_shenpy | 过河 | C++ | 通过 | 1 MS | 592 KB | 1234 | 2026-05-15 15:22:44 |
// 算法竞赛->第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; }