38 lines
1008 B
C++
38 lines
1008 B
C++
|
|
#include <bits/stdc++.h>
|
|||
|
|
using namespace std;
|
|||
|
|
const int N = 100500;
|
|||
|
|
int n, s, t, m; // n个长度的桥,s:起始,t:终止 m:多少个石子
|
|||
|
|
int w[N];
|
|||
|
|
const int INF = 0x3f3f3f3f;
|
|||
|
|
/*
|
|||
|
|
10
|
|||
|
|
2 3 5
|
|||
|
|
2 3 5 6 7
|
|||
|
|
*/
|
|||
|
|
int f[N]; // f[i]表示从0到i的最少石子数
|
|||
|
|
int main() {
|
|||
|
|
cin >> n;
|
|||
|
|
cin >> s >> t >> m;
|
|||
|
|
for (int i = 1; i <= m; i++) {
|
|||
|
|
int x;
|
|||
|
|
cin >> x;
|
|||
|
|
w[x] = 1; // 这个位置上有石子
|
|||
|
|
}
|
|||
|
|
// 初始化要扩展到n+t
|
|||
|
|
memset(f, 0x3f, sizeof(f));
|
|||
|
|
f[0] = 0; // 出发点需要踩0个石子
|
|||
|
|
|
|||
|
|
// 简单的DP
|
|||
|
|
for (int i = 1; i < n + t; i++)
|
|||
|
|
for (int j = i - t; j <= i - s; j++)
|
|||
|
|
// 只有在桥上的位置才需要计算石子数
|
|||
|
|
// 不建议把判断条件写在for里面,建议写在for里层,这样好理解
|
|||
|
|
if (j >= 0)
|
|||
|
|
f[i] = min(f[i], f[j] + w[i]);
|
|||
|
|
|
|||
|
|
int res = INF;
|
|||
|
|
for (int i = n; i < n + t; i++) // 从n开始,到n+t-1都是可能的终点
|
|||
|
|
res = min(res, f[i]);
|
|||
|
|
printf("%d\n", res);
|
|||
|
|
return 0;
|
|||
|
|
}
|