IOI2015 boxes纪念品盒
BZOJ 4368: [IOI2015]boxes纪念品盒
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纪念品盒的更多相关文章
- 4368: [IOI2015]boxes纪念品盒
4368: [IOI2015]boxes纪念品盒 链接 分析 链接 代码 #include<bits/stdc++.h> using namespace std; typedef long ...
- [bzoj4368][IOI2015]boxes纪念品盒_动态规划_单调队列_贪心
bzoj4368 IOI2015 boxes纪念品盒 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368 数据范围:略. 题解: 如果在一个最 ...
- [BZOJ] IOI2015 Boxes纪念品盒
问题描述 IOI2015 开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子.然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放 ...
- 题解 [BZOJ4368][IOI2015]boxes纪念品盒
题面 解析 可以发现,发纪念品有三种方式: 从左边走再原路返回. 从右边走再原路返回. 走一圈. 注意到,第三种走法最多只会走一次, 因为如果走了多次,那发放的物品数量就会>=\(2k\), 那 ...
- BZOJ 4368: [IOI2015]boxes纪念品盒
三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...
- BZOJ 4368: [IOI2015]boxes纪念品盒 贪心
题意:给定一个环,环上有一些点包裹,你要从 $0$ 号点出发,然后每次带上一个容量为 $k$ 的背包. 问:如果要把所有的包裹都带回 $0$ 好点最少要走多少距离. 每一次只有 $3$ 种走法:走整圆 ...
- IOI2015 Boxes
Description 给出一个环形,n个点,每次只能访问k个点,求最短距离. Sol 贪心. CCF的题解. 首先只会最多走一趟环形,根据抽屉原理,如果一边不足k个才会到另一边,所以对于第二次以上的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- pandas绘图总结
转自:http://blog.csdn.net/genome_denovo/article/details/78322628 pandas绘图总结 pandas中的绘图函数(更加详细的绘图资料可参考p ...
随机推荐
- mock 模拟数据在框架中的简单使用
首先在框架中需要安装mock模块 cnpm i mockjs -S 其次在src文件夹下新建mock文件夹,在mock文件夹中新建一个index.js文件 代码如下: const Mock = req ...
- 2019年最新50道java基础部分面试题(四)
前35题请移步上几篇文章 36.数组有没有length()这个方法? String有没有length()这个方法? 数组没有length()这个方法,有length的属性.String有有lengt ...
- Java并发编程:Java实现多线程的几种方式
在Java中,多线程主要的实现方式有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService ...
- 趣谈Linux操作系统学习笔记:第二十五讲
一.mmap原理 在虚拟内存空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同内存块,这个变量名字叫mmap struct mm_struct { str ...
- 函数基础实战之ATM和购物车系统
username_list = [] prize_dict = { '0': "芭比娃娃", '1': "变形金刚", '2': "psp游戏机&qu ...
- vs2010,vs2013,vs2015,vs2017, vs2019激活秘钥
vs2010============================================== YCFHQ9DWCYDKV88T2TMHG7BHP vs2013=============== ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- JDBC释放数据库连接
try(){}写法会自动关闭连接 String sql = "select password from user where name = ?"; try(Connection c ...
- Mac 应用程序不能打开解决方法
Mac 应用程序不能打开解决方法 关键是 文件原本是可执行文件,由于权限丢失,才变成了类型不明的文件,导致软件无法打开. 参考: https://www.macbl.com/article/tips/ ...
- solidity智能合约如何判断mapping值为空
mapping值的判断问题 在Java这类编程语言中,我们可以获得Map里面的值然后与null或空来进行判断该key对应的值是否为空.可是在solidity中貌似并没有提供类似的判断.那么我们如果来进 ...