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\)(即值等于其下标)的数删掉,然后剩下的数组 ...
随机推荐
- opencv6.3-imgproc图像处理模块之边缘检测
接opencv6.2-improc图像处理模块之图像尺寸上的操作 本文大部分都是来自于转http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutori ...
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.2
最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...
- <实训|第十二天>用LVM对linux分区进行动态扩容
[root@localhost~]#序言在linux中,我们安装软件的途径一般有那些,你们知道吗?在linux中,如果你的磁盘空间不够用了,你知道如何来扩展磁盘吗?动态扩容不仅在工作中还是在其他方面都 ...
- LeetCode Weekly Contest 8
LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...
- ElasticSearch入门系列(六)分布式操作
一.路由文档到分片 当你索引一个文档的时候,他被存储在单独一个主分片上.Elasticsearch根据一个算法来找到所在分片上. shard=hash(routing)%number_of_prima ...
- window 安装redis服务、卸载redis服务和启动redis服务
1.安装redis服务 redis-install.bat 1 echo install redis-server23 D:\redis\redis-server.exe --service-inst ...
- JS是按值传递还是按引用传递
按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值并不会影响实参. 按引用传递(call by reference)时,函数的形参接收实参的隐式 ...
- nginx 编译参数详解(运维不得不看)
nginx参数: --prefix= 指向安装目录 --sbin-path 指向(执行)程序文件(nginx) --conf-path= 指向配置文件(nginx.conf) --error-log- ...
- 关于ExtJS、JQuery UI和easy UI的选择问题
转自百度知道. 问:做企业级应用,比如***管理系统,不需要华丽的特效,只希望简单,风格统一.能用到的只有messagebox.tree.grid大概这几个,其他特效不要,忘大神根据自己的见解以及我这 ...