关于距离的一个问题

P1052 [NOIP2005 提高组] 过河

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


|