题目链接:http://uoj.ac/problem/229
题目大意:
给定一个环,上面有n个点,有m个关键点,每次从0开始只能携带k个
物品,问最少走多少路径,才能满足所有关键点都得到物品。
分析:
首先可以贪心地把关键点分成三种情况
1.左来左回 f[i]:从左到i满足的最小路径
2.右来右回 g[i]:从右到i满足的最小路径
3.走一圈
f[i]=f[max(0,i-k)]+2*p[i-1] (*2是表示来回路径)
g[i]=g[min(n+1,i+k)]+2*(L-p[i-1]) (p是从0开始的)
统计答案:
枚举分割线
ans=min(f[i]+g[i+1])
还有一种情况是中间一段的k个需要走一圈
if(i+k<=N) ans=min(ans,f[i]+g[i+k+1]+L)
附上代码:
#include "boxes.h" #include<bits/stdc++.h> using namespace std; const int N=1e7+12; long long ans; long long f[N],g[N]; long long delivery(int N, int K, int L, int p[]) { ans=1LL<<60; f[0]=g[N+1]=0; for(int i=1;i<=N;i++) f[i]=f[max(0,i-K)]+(p[i-1]<<1); for(int i=N;i>=1;i--) g[i]=g[min(N+1,i+K)]+((L-p[i-1])<<1); for(int i=0;i<=N;i++) { ans=min(ans,f[i]+g[i+1]); if(i+K<=N) ans=min(ans,f[i]+g[i+K+1]+L); } return ans; }