60pts 代码如下
```cpp
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 110;
const int MAXM = 3000010;
const int INF = 0x3f3f3f3f;
int L, s, t, n, a[MAXN], b[MAXN];
bool val[MAXM];
int f[MAXM];
int gcd(int a, int b) {return b?gcd(b, a%b):a;}
int lcm(int x, int y) {return x/gcd(x,y)*y;}
int main()
{
scanf("%d%d%d%d",&L,&s,&t,&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[++n] = L;
sort(a+1, a+n+1);
a[0] = 0;
int d = 1;
for(int i=s;i<=t;i++)
d = lcm(d, i);
for(int i=1;i<=n;i++)
b[i] = (a[i] - a[i-1]) % d;
for(int i=1;i<=n;i++)
a[i] = a[i-1] + b[i], val[a[i]] = (a[i]!=L);
L = a[n];
for(int i=1;i<=L+t;i++)
f[i] = INF;
f[0] = 0;
for(int i=1;i<=L+t;i++)
for(int j=s;j<=min(i, t);j++)
f[i] = min(f[i], f[i-j] + val[i]);
int ans = INF;
for(int i=L;i<L+t;i++)
ans = min(ans, f[i]);
printf("%d\n",ans);
return 0;
}
```
by Rusalka @ 2020-09-16 19:15:12
@[ifndef](/user/151601) 我觉得这道题缩距离不能直接模,应该是把距离大于%D的部分缩成一个D
因为那些D的倍数才是多余的
by Rui_R @ 2020-09-16 19:50:33
直接%D是错的
by Rui_R @ 2020-09-16 19:50:58
```if(dis[i]>2520) dis[i]%=d,dis[i]+=d;```
dis指两石子间距离
by Rui_R @ 2020-09-16 19:54:18
@[Rui_R](/user/101984) 请问是应该改成这样吗
```cpp
for(int i=1;i<=n;i++)
b[i] = min(d, a[i] - a[i-1]);
```
这样子会错两个点QAQ
by Rusalka @ 2020-09-16 19:59:44
@[Rui_R](/user/101984) 好的,谢谢(时差害人qwq
by Rusalka @ 2020-09-16 20:00:49