问题描述

IOI2015 开幕式正在进行最后一个环节。按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子。然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放纪念品这件事。Aman 是一位热情的志愿者,为使得 IOI 尽量圆满,他要用最短的时间将所有纪念品发放出去。

开幕式的场地是一个圆环,被分为 个完全相等的区域,这些区域的编号依次为 0 到 L-1,也就是说,对于 0≤i≤L-2,区域 i 与区域 i+1 相邻,且区域 L-1 与区域 0 相邻。场地上共有N 个代表队,每队坐在上面的一个区域上,每个区域可以包含任意多个代表队,也可以为空。共有 N 个相同的纪念品。开始,Aman 和所有纪念品都在区域 0。Aman 应该给每队一个纪念品,并且在发放完最后一个纪念品后他必须回到区域 0。注意,有些队可能坐在区域 0。

在任意时刻,Aman 只能够携带至多 K 个纪念品。Aman 必须从区域 0 取走这些纪念品,且取纪念品不需要时间。纪念品一旦从区域 0 被取走后,Aman 只能将其发放给某个代表队或者随身携带。无论何时,Aman 携带一个或更多的纪念品到达一个这样的区域,该区域有一个代表队尚未收到纪念品,Aman 便可将他携带的一个纪念品发给这个代表队。这种发放也在瞬间完成。他所花的时间都消耗在区域之间的移动上。无论携带多少纪念品,Aman 都需要 1 秒钟从一个区域移动到其相邻的区域(可以顺时针移动也可以逆时针移动)。

你的任务是计算出 Aman 发放完所有纪念品并返回到他的最初区域所需要的最短时间(秒数)。

输入格式

第一行: N K L

第二行: positions[0] ... positions[N-1]

N: 代表队的数目。

K: Aman 在同一时间能够携带纪念品的最大数目。

L: 开幕式场地上的区域数目。

positions: 一个长度为 N 的数组,positions[0],...,positions[N-1]给出了所有代表队所在区域的编号。positions 的元素按非递减排序。

输出格式

一个整数,表示 Aman 能够完成这一任务所需的最短时间(秒数)。

样例输入输出

Input

3 2 8

1 2 5

Output

10

解析

考虑到只有三种移动方式,往左再回来,往右再回来,以及绕一圈。再仔细考虑,绕一圈在最优解中只有可能进行一次,因为假设绕了两次,一共发放了2k件物品,那么左右半圈一定有一个的团队数量大于等于k,所以在最开始往左或往右后在绕一圈不会更差。

由此,我们使用贪心策略,用第一第二种方法将靠近0的一些团队解决,再绕一圈解决中间没拿到纪念品的。分别预处理左半圈和右半圈每个点i送到所需的时间,然后枚举长度为k的连续区间,这段区间内通过绕一圈解决,计算答案取最小值即可。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 10000002
using namespace std;
long long n,k,l,i,pos,s1[N],s2[N],f1[N],f2[N],top1,top2;
long long read()
{
char c=getchar();
long long w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
int main()
{
n=read();k=read();l=read();
for(i=1;i<=n;i++){
pos=read();
if(pos<=l/2) s1[++top1]=pos;
else s2[++top2]=pos;
}
int tmp[N];
for(i=1;i<=top2;i++) tmp[i]=s2[top2-i+1];
for(i=1;i<=top2;i++) s2[i]=tmp[i];
for(i=1;i<=top1;i++){
if(i<=k) f1[i]=s1[i];
else f1[i]=f1[i-k]+s1[i];
}
for(i=1;i<=top2;i++){
if(i<=k) f2[i]=l-s2[i];
else f2[i]=f2[i-k]+l-s2[i];
}
long long ans=(f1[top1]+f2[top2])*2;
for(i=top1-k;i<=top1;i++){
ans=min(ans,(f1[max(i,1LL*0)]+f2[max(top2-k+top1-i,1LL*0)])*2+l);
}
cout<<ans<<endl;
return 0;
}

[BZOJ] IOI2015 Boxes纪念品盒的更多相关文章

  1. IOI2015 boxes纪念品盒

    BZOJ 4368: [IOI2015]boxes纪念品盒 BZOJ传送门 Description IOI2015开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装 ...

  2. 4368: [IOI2015]boxes纪念品盒

    4368: [IOI2015]boxes纪念品盒 链接 分析 链接 代码 #include<bits/stdc++.h> using namespace std; typedef long ...

  3. [bzoj4368][IOI2015]boxes纪念品盒_动态规划_单调队列_贪心

    bzoj4368 IOI2015 boxes纪念品盒 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368 数据范围:略. 题解: 如果在一个最 ...

  4. BZOJ 4368: [IOI2015]boxes纪念品盒

    三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...

  5. BZOJ 4368: [IOI2015]boxes纪念品盒 贪心

    题意:给定一个环,环上有一些点包裹,你要从 $0$ 号点出发,然后每次带上一个容量为 $k$ 的背包. 问:如果要把所有的包裹都带回 $0$ 好点最少要走多少距离. 每一次只有 $3$ 种走法:走整圆 ...

  6. 题解 [BZOJ4368][IOI2015]boxes纪念品盒

    题面 解析 可以发现,发纪念品有三种方式: 从左边走再原路返回. 从右边走再原路返回. 走一圈. 注意到,第三种走法最多只会走一次, 因为如果走了多次,那发放的物品数量就会>=\(2k\), 那 ...

  7. IOI2015 Boxes

    Description 给出一个环形,n个点,每次只能访问k个点,求最短距离. Sol 贪心. CCF的题解. 首先只会最多走一趟环形,根据抽屉原理,如果一边不足k个才会到另一边,所以对于第二次以上的 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. pandas绘图总结

    转自:http://blog.csdn.net/genome_denovo/article/details/78322628 pandas绘图总结 pandas中的绘图函数(更加详细的绘图资料可参考p ...

随机推荐

  1. 【adb真机查Log】Android Studio 3.X 找不到Android Device Monitor

    参考来源:https://blog.csdn.net/yuanxiang01/article/details/80494842 以下信息来源于Android Developers官网 Android设 ...

  2. 图论&线性基(?)(8.12)

    边没有负权,最短路最多只有n条边 很暴力的思想: 先跑一遍最短路,找出最短路上的边,枚举每条边,翻倍,放进原图再跑一遍.取最大值 好熟悉啊 分层建图,建k层 每层内部是原图 若原图中u到v有连边,则由 ...

  3. malloc函数分配内存失败的常见原因

    malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...

  4. Window下,在TEMP路径下生成一个临时文件名

    BOOL GetFullTempFileName(const TCHAR* strPrefix, std::wstring& strFullName) { TCHAR strTempFolde ...

  5. SSM Maven MallDemo项目为例

    一.创建maven项目 项目结构 创建一个空项目 1. mall (**pom**) 父模块,用于放置公共属性.依赖关系等. 2. mall-util (**jar**) 工具模块,用于放置常用工具类 ...

  6. linux下vscode备忘

    vscode如何自定义,如何方便地编写c/c++vscode支持vim.sublime快捷键,在设置->keymap可以安装相应插件vscode默认的快捷键支持自定义,打开keyboard sh ...

  7. SoapUI学习之SOAP和REST的区别

    一.Soap和Rest的定义 SOAP(Simple Object Access Protocol 简单对象访问协议),用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,事实上 ...

  8. 应用安全-Web安全-CSRF攻防整理

    原理 - 登录受信任网站A,并在本地生成Cookie.在不登出A的情况下,访问危险网站B. #csrfdemo.php <?php $data = json_decode(file_get_co ...

  9. 前端 CSS层叠性 CSS选择器优先级

    层叠性 层叠性:权重的标签覆盖掉了权重小的标签,说白了 ,就是被干掉了 权重:谁的权重大,浏览器就会显示谁的属性 我们现在已经学过了很多的选择器,也就是说在一个HTML页面中有很多种方式找到一个元素并 ...

  10. PL/SQL Developer工具

    安装好Oracle以后我们发现在控制台来操作数据库很繁琐,而且也不方便阅读.所以,我们就要用到PL/SQL Developer工具,以达到能更好的操作数据库的目的. PL/SQL Developer简 ...