题目链接:https://ac.nowcoder.com/acm/problem/16655
思路:
石头可能隔的非常远。我们必须离散化,如果a[i]-a[i-1]=90我们可以设置a[i]=a[i-1]+90。
然后直接DP就可以了。
#include <bits/stdc++.h> using namespace std; int a[205], b[205], f[300*105], vis[300*105]; int main(){ int L, S, T, M; scanf("%d%d%d%d", &L, &S, &T, &M); for(int i=1; i<=M; i++){ scanf("%d", &a[i]); } sort(a+1, a+M+1); int ans=0; if(S==T){ for(int i=1; i<=M; i++){ if(a[i]%S==0){ ans++; } } printf("%d\n", ans); return 0; } for(int i=1; i<=M; i++){ int dis=a[i]-a[i-1]; if(dis>=S*T){ dis=S*T; } b[i]=b[i-1]+dis; vis[b[i]]=1; } L=b[M]+S*T; memset(f, 0x7f, sizeof(f)); f[0]=0; for(int i=1; i<=L; i++){ for(int j=S; j<=T; j++){ if(i-j>=0){ f[i]=min(f[i], f[i-j]+vis[i]); } } } int mi=1<<30; for(int i=b[M]; i<=L; i++){ mi=min(mi, f[i]); } cout<<mi<<endl; return 0; }