CodeForces - 551C 二分+贪心
题意:有n个箱子形成的堆,现在有m个学生,每个学生每一秒可以有两种操作:
1: 向右移动一格
2: 移除当前位置的一个箱子
求移除所有箱子需要的最短时间。注意:所有学生可以同时行动。
思路:二分时间,判断当前限制的时间是否可以移除完所有箱子。那么如何判断呢? 设lim表示当前的时间限制,走到第个堆花费秒,从第n个堆开始处理,第i个堆需要的学生数是,可能,那么就剩余的箱子可以拿,既然是从1走到i那么,一定可以移除前面的箱子,这样一直就行。复杂度O(n)
AC代码
#include <cstdio>
#include <cmath>
#include <cctype>
#include <bitset>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const double pii = acos(-1.0);
const int maxn = 1e5 + 5;
int n, m;
LL box[maxn], pbox[maxn];
bool check(LL lim) {
LL rest = 0, cnt = m;
for(int i = n-1; i >= 0; --i) {
pbox[i] = box[i];
if(rest >= pbox[i]) {
rest -= pbox[i];
pbox[i] = 0;
}
else {
pbox[i] -= rest;
rest = 0;
}
LL dis = i+1;
if(pbox[i] == 0) continue;
if(lim <= dis) return false;
//pbox[i] <= x*(lim-dis)
LL num = (LL)ceil(1.0*pbox[i]/(lim-dis));
if(num > cnt) return false;
cnt -= num;
rest += num*(lim-dis) - pbox[i];
}
return true;
}
LL solve(LL x, LL y) {
while(x < y) {
LL mid = (x+y) / 2;
if(check(mid)) y = mid;
else x = mid+1;
}
return y;
}
int main() {
while(scanf("%d%d", &n, &m) == 2) {
LL sum = 0;
for(int i = 0; i < n; ++i) {
scanf("%lld", &box[i]);
sum += box[i] + i;
}
printf("%lld\n", solve(0, sum+5));
}
return 0;
}
如有不当之处欢迎指出!
CodeForces - 551C 二分+贪心的更多相关文章
- Codeforces 732D [二分 ][贪心]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: n天进行m科考试,每科考试需要a的复习时间,n天每天最多可以考一科.并且指定哪天考哪科. 注意考试那天不能复习. 问最少需要多少天可全部通过考试. ...
- Codeforces 825D 二分贪心
题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心
/** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...
- CodeForces - 158B.Taxi (贪心)
CodeForces - 158B.Taxi (贪心) 题意分析 首先对1234的个数分别统计,4人组的直接加上即可.然后让1和3成对处理,只有2种情况,第一种是1多,就让剩下的1和2组队处理,另外一 ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- Codeforces_732D_(二分贪心)
D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- CF732D Exams 二分 贪心
思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...
- $CF949D\ Curfew$ 二分/贪心
正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...
随机推荐
- 爬取知名社区技术文章_pipelines_4
获取字段的存储处理和获取普通的路径 #!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import gevent import pym ...
- 使用SoapUI调用Vsphere Web Service
项目中经常需要调用Webservice进行验证测试,下面就介绍下如何使用测试工具SoapUI调用Vsphere vcenter的 Web Service VSphere的Webservice地址默认为 ...
- Linux指令--diff
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...
- JDK 中的设计模式应用实例
在 JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改 JDK 源码的前提下开发出自己的应用软件.研究 JDK 类库中的模式实例也不 ...
- 一个Android上的以滑动揭示的方式显示并切换图片的View
SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...
- Spring MVC (JDK8+Tomcat8)
1 Spring MVC概述 Spring MVC是Spring为表现层提供的基于MVC设计理念的优秀的web框架,是目前最主流的MVC框架之一. Spring3.0后全面超越Struts2,成为最优 ...
- PHP支付第3方接口使用方法。
去年写过一遍博客文章. 网站申请不到支付宝接口.微信接口,免接口收款实现方式. 网络在发展,支付宝也好,微信也好,技术在进步,这种方式已经不能使用了,明显的一个问题是,支付宝的刷新工具,会定时退出,必 ...
- Go笔记-标准库的介绍
[unsafe]包含了一些打破Go语言“类型安全”的命令,一般的程序中不会被使用,可用在C/C++程序的调用中 [syscall]底层的外部包,提供了操作系统底层调用的基本接口 [os/exec]提供 ...
- ConcurrentHashMap、CopyOnWriteArrayList、LinkedHashMap
HashMap中未进行同步考虑,而Hashtable在每个方法上加上了synchronized,锁住了整个Hash表,一个时刻只能有一个线程操作,其他的线程则只能等待,在并发的环境下,这样的操作导致H ...
- BZOJ 1086: [SCOI2005]王室联邦 [树上分块]
portal 题意: 树分成若干块大小在$[s,3s]$之间,每块有一个根(可以不在块内),所有点到根路径上的点都必须在块内 据说这是一个保证了块大小直径个数的科学分块方法,貌似只有本题有用 我错了 ...