IOI2015. boxes


题目链接: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;
}
View Code

题目大意:给定一个环,上面有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)



猜你喜欢

转载自www.cnblogs.com/Heey/p/8982082.html