CF 84D Doctor(二分)
题目链接: 传送门
Doctor
time limit per test:1 second memory limit per test:256 megabytes
Description
There are n animals in the queue to Dr. Dolittle. When an animal comes into the office, the doctor examines him, gives prescriptions, appoints tests and may appoint extra examination. Doc knows all the forest animals perfectly well and therefore knows exactly that the animal number i in the queue will have to visit his office exactly ai times. We will assume that an examination takes much more time than making tests and other extra procedures, and therefore we will assume that once an animal leaves the room, it immediately gets to the end of the queue to the doctor. Of course, if the animal has visited the doctor as many times as necessary, then it doesn't have to stand at the end of the queue and it immediately goes home.
Doctor plans to go home after receiving k animals, and therefore what the queue will look like at that moment is important for him. Since the doctor works long hours and she can't get distracted like that after all, she asked you to figure it out.
Input
The first line of input data contains two space-separated integers n and k (1 ≤ n ≤ 105, 0 ≤ k ≤ 1014). In the second line are given space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Please do not use the %lld specificator to read or write 64-bit numbers in C++. It is recommended to use cin, cout streams (you can also use the %I64d specificator).
Output
If the doctor will overall carry out less than k examinations, print a single number "-1" (without quotes). Otherwise, print the sequence of numbers — number of animals in the order in which they stand in the queue.
Note that this sequence may be empty. This case is present in pretests. You can just print nothing or print one "End of line"-character. Both will be accepted.
Sample Input
3 3
1 2 1
4 10
3 3 2 1
7 10
1 3 3 1 2 3 1
Sample Output
2
-1
6 2 3
解体思路:
题目大意:n只动物排队看病,每只动物需要看病的次数不一,每次医生只给一只动物看病,未满足看病次数的动物在给医生看完病后需要排队尾再次等待。问K次后剩下的动物的编号序列。
通过二分找出动物们完成K次看病时单个动物看病次数的最大值,然后剔除已经满足看病次数的动物,最后对于未剔除的输出编号。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef __int64 LL;
const LL INF = 0x3f3f3f3f;
LL ans[100005];
LL N,K;
bool OK(LL x)
{
LL sum = 0;
for (int i = 0;i < N;i++)
{
sum += min(x,ans[i]);
}
return sum >= K;
}
int main()
{
while (~scanf("%I64d%I64d",&N,&K))
{
LL sum = 0;
vector<LL>itv;
vector<LL>::iterator it;
memset(ans,0,sizeof(ans));
for (int i = 0;i < N;i++)
{
scanf("%I64d",&ans[i]);
sum += ans[i];
}
if (K > sum)
{
printf("-1\n");
continue;
}
LL left = 0,right = INF;
while (left < right - 1)
{
LL mid = left + ((right-left) >> 1);
if (OK(mid))
{
right = mid;
}
else
{
left = mid;
}
}
LL val = left;
cout << right << endl;
cout << val << endl;
for (int i = 0;i < N;i++)
{
K -= min(ans[i],val);
ans[i] -= min(ans[i],val);
}
for (int i = 0;i < N;i++)
{
if (K && ans[i])
{
ans[i]--;
K--;
}
else if (!K && ans[i])
{
itv.push_back(i+1);
ans[i] = 0;
}
}
for (int i = 0;i < N;i++)
{
if (ans[i])
{
itv.push_back(i+1);
}
}
bool first = true;
for (it = itv.begin();it != itv.end();it++)
{
first?printf("%I64d",*it):printf(" %I64d",*it);
first = false;
}
printf("\n");
}
return 0;
}
CF 84D Doctor(二分)的更多相关文章
- CF 706B 简单二分,水
1.CF 706B Interesting drink 2.链接:http://codeforces.com/problemset/problem/706/B 3.总结:二分 题意:给出n个数,再给 ...
- [CF#592 E] [二分答案] Minimizing Difference
链接:http://codeforces.com/contest/1244/problem/E 题意: 给定包含$n$个数的数组,你可以执行最多k次操作,使得数组的一个数加1或者减1. 问合理的操作, ...
- CF 1042A Benches——二分答案(水题)
题目:http://codeforces.com/problemset/problem/1042/A #include<iostream> #include<cstdio> # ...
- codeforces 700A As Fast As Possible 二分求和?我觉得直接解更好
分析:一辆车最多载k个人,车的速度肯定比人快,所以想要到达时间最短,那么每个人必须做一次公交车.那么把n个人分成p=(n+k-1)/k组.设最短时间为t,每人乘车时间为t1,则t1*v2+(t-t1) ...
- Codeforces 846D Monitor(简单二分+二维BIT)
D. Monitor time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- 树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]
This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...
- CF 600B Queries about less or equal elements --- 二分查找
CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中 ...
- 【Cf #503 B】The hat(二分)
为什么Cf上所有的交互题都是$binary \; Search$... 把序列分成前后两个相等的部分,每一个都可以看成一条斜率为正负$1$的折线.我们把他们放在一起,显然,当折线的交点的横坐标为整数时 ...
- CF 1405E Fixed Point Removal【线段树上二分】
CF 1405E Fixed Point Removal[线段树上二分] 题意: 给定长度为\(n\)的序列\(A\),每次操作可以把\(A_i = i\)(即值等于其下标)的数删掉,然后剩下的数组 ...
随机推荐
- http缓存提高性能
秋招也算是正式结束了,现在整理一下笔记,当作巩固一下知识,也希望这个对大家有帮助 http 缓存 和 cdn 缓存可以说是面试必问的问题,竟然是必问的问题,那就总结全面一点- http缓存机制 缓存分 ...
- Bootstrap系列 -- 43. 固定导航条
很多情况之一,设计师希望导航条固定在浏览器顶部或底部,这种固定式导航条的应用在移动端开发中更为常见.Bootstrap框架提供了两种固定导航条的方式: .navbar-fixed-top:导航条固定 ...
- ZeroClipboard / jquery.zclip.min.js跨浏览器复制插件使用中遇到的问题解决
之前写过一个淘宝优惠券连接PC端转手机端连接的小工具,当时写到将转换好的url复制到剪切板这块时解决了IE和火狐,就是没办法搞定Chrome,知道可以通过flash搞定,但是觉得太麻烦没有仔细研究. ...
- SQL 2014 in-memory中的storage部分
基于CTP1的官方白皮书,自己理解的内容.白皮书下载地址:http://download.microsoft.com/download/F/5/0/F5096A71-3C31-4E9F-864E-A6 ...
- Nginx 负载均衡
Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html
- 分布式拒绝服务攻击 DDoS
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒 ...
- poj 1698 Alice‘s Chance
poj 1698 Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...
- python内置数据类型-字典和列表的排序 python BIT sort——dict and list
python中字典按键或键值排序(我转!) 一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...
- eclipse下package的命名规范
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...
- display~