IOI2015day1. 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

 

 

 


 

转载于:https://www.cnblogs.com/Heey/p/8982082.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值