BZOJ 4368: [IOI2015]boxes纪念品盒

BZOJ传送门

Description

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

开幕式的场地是一个圆环,被分为 个完全相等的区域,这些区域的编号依次为 到,也就是说,对于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发放完所有纪念品并返回到他的最初区域所需要的最短时间(秒数)。

Input

第一行: N K L

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

N: 代表队的数目。

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

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

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

Output

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

Sample Input

3 2 8

1 2 5

Sample Output

10

HINT

题解:

2019.10.31 IOI模拟赛T1(滑稽)爆零场

一开始想到的是贪心,但是贪心策略一直是错的,思路也不是很清晰,通过特判拿了25分但是数据强一点还是爆零。

还是感谢一下出题人吧@EM-LGH

正解思路:

很容易发现这样一个走路方式:

对于这个圈,我们可以向左走几个点,原路返回。也可以向右走几个点然后返回。这是我在考场上想到的。但我忽略了一种情况:也可以走一圈回来(就是向左/向右走几个点之后不原路返回直接从另一个方向回去)。

那么剩下的是我们的决策过程。我们发现,走一圈这种决策只能使用一次,因为走两圈一共会分发\(2k\)个纪念品,根据抽屉原理,左边和右边肯定会有一侧\(\ge k\),那么就不是最优决策。

那么,贪心一下,先用原路返回的方式处理一下比较优的抉择,也就是离零点比较近的左右点。然后再走一圈完事。

代码:

#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=1e7+10;
int n,k,l;
int sl[maxn],sr[maxn],cntl,cntr;
int fl[maxn],fr[maxn];
signed main()
{
scanf("%lld%lld%lld",&n,&k,&l);
for(int i=1;i<=n;i++)
{
int x;
scanf("%lld",&x);
if(x<=l/2)
sl[++cntl]=x;
else
sr[++cntr]=l-x;
}
for(int i=1;i<=cntr && i<=cntr-i+1;i++)
swap(sr[i],sr[cntr-i+1]);
for(int i=1;i<=cntl;i++)
{
if(i<=k)
fl[i]=sl[i];
else
fl[i]=fl[i-k]+sl[i];
}
for(int i=1;i<=cntr;i++)
{
if(i<=k)
fr[i]=sr[i];
else
fr[i]=fr[i-k]+sr[i];
}
int ans=(fl[cntl]+fr[cntr])<<1;
for(int i=cntl-k;i<=cntl;i++)
ans=min(ans,(fl[i]+fr[max(cntr-k+cntl-i,0ll)])*2+l);
printf("%lld",ans);
return 0;
}

IOI2015 boxes纪念品盒的更多相关文章

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

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

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

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

  3. [BZOJ] IOI2015 Boxes纪念品盒

    问题描述 IOI2015 开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子.然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放 ...

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

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

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

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

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

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

  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. C语言中,字符型数字与常数型数字的加减实现

    char in-str[10],out-str[10]; for(int i=0;i<10;i++) { out-str[i]=9-(in-str[i]-'0')+'0'; }

  2. Linux下修改Mysql密码的三种方式

    前言 有时我们会忘记Mysql的密码,或者想改一个密码,以下将对这两种情况修改密码的三种解决方法做个总结 本文都以用户为 root 为例 一.拥有原来的myql的root的密码 方法一: 在mysql ...

  3. C#开发BIMFACE系列15 服务端API之获取模型的View token

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken>中详细介绍了应用程序访问API的令牌凭证.我 ...

  4. HTML连载50-伪元素选择器、清除浮动方式五

    一.伪元素选择器 1.什么是伪元素选择器 伪元素选择器作用给指定标签的内容前面添加一个子元素,或者给指定标签的内容后面添加一个子元素. 2.格式: 标签名称::before{ 属性名称:值: } 给指 ...

  5. php time() 和 $_SERVER['REQUEST_TIME']

    time() 和 $_SERVER['REQUEST_TIME']效率 结果:(其中之一) 结论: time() : 执行时间在0.10 - 0.30 之间 $_SERVER['REQUEST_TIM ...

  6. python 各层级目录下的import方法

    ---恢复内容开始--- 以前经常使用python2.现在很多东西都切换到了python3,发现很多东西还是存在一些差异化的.跨目录import是常用的一种方法,并且有不同的表现形式,新手很容易搞混. ...

  7. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 5

    18.5  使用PDO对象 PDO扩展类库为PHP访问数据库定义了一个轻量级.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据 ...

  8. 【shell脚本】点名器===randomName.sh

    随机点名,从name.txt文件中读取名字 [root@VM_0_10_centos shellScript]# cat randowName.sh #!/bin/bash # 随机点名器 # 需提前 ...

  9. jQuery 源码分析(十五) 数据操作模块 val详解

    jQuery的属性操作模块总共有4个部分,本篇说一下最后一个部分:val值的操作,也是属性操作里最简单的吧,只有一个API,如下: val(vlaue)        ;获取匹配元素集合中第一个元素的 ...

  10. ASP.NET 数据绑定

    控件绑定数据源控件手动方式: DataSourceID = 数据源控件名称下拉框绑定 A.设置Datasource B.DataTextField="name"' //显示的值 C ...