JDOJ 2225: 工资计划

https://neooj.com/oldoj/problem.php?id=2225

Description

高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱。从今天起,

Matrix67将连续工作N天(1<=N<=100 000)。每一天末他可以领取当天及前面若干

天里没有领取的工资,但他总共只有M(1<=M<=N)次领取工资的机会。Matrix67已

经知道了在接下来的这N天里每一天他可以赚多少钱。为了避免自己滥用零花钱,

他希望知道如何安排领取工资的时间才能使得领到工资最多的那一次工资数额最小。

注意Matrix67必须恰好领工资M次,且需要将所有的工资全部领走(即最后一天末需

要领一次工资)。

Input

第一行输入两个用空格隔开的正整数N和M
以下N行每行一个不超过10000正整数,依次表示每一天的薪水。

Output

输出领取到的工资的最大值最小是多少。

Sample Input

7 5
100
400
300
100
500
101
400

Sample Output

500
 
二分答案的基础题。作为本蒟蒻博客里二分答案的第一篇题解,在这里献丑讲解一下二分答案的基本实现原理及注意事项。
二分答案,就是在答案的所有可能区间里应用二分思想。
什么时候用二分答案呢?首先,要有单调性,也就是答案所在区域是单调递增或单调递减的,保证二分之后的结果仍然正确。
一般来讲,题面中出现最小值最大或者最大值最小,就可以用二分求解了。
那么我们开始二分...
二分要注意左边界和右边界,一般使用while循环实现,每次循环用mid取中间值,然后针对于中间值进行函数判断,判断此解符不符合要求,如果不符合,是大了还是小了。然后右移左端点或者左移右端点。
最后得出答案。
二分过程最重要的部分就是判断函数的书写和二分的细节。
什么是二分的细节呢?
我俗气一点说,就是+1和-1的问题,因为是整数除法,有的时候取mid的时候就会取到你不想取的地方导致答案错误,这时要仔细斟酌左移和右移到底需不需要加一或者减一。
最后,取答案的时候也要注意,你取的答案需不需要加减。
总结一下,二分思想特别容易理解,但二分细节特别容易坑爹。
 
那么回到本题,本题的二分很好想。
首先,答案区域的边界,以总工资为上界,以最小的单天工资为下界。
然后是判断函数,扫一遍,从第一天到第n天领工资。
如果领取的总工资tot还没有达到我们的mid,那就继续累加下一天,什么时候冒了,什么时候停止,这个时候就算是领了一次工资。
记住最后退出循环的时候也要特判,因为强制规定最后的那天也要领工资。
最后统计cnt和m的关系,合法就返回1,不合法返回0.
 
最后二分,结束。
 
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,sum,ans,maxn;
int a[];
bool check(int x)
{
int tot=,cnt=;
for(int i=;i<=n;i++)
{
if(tot+a[i]<=x)
{
tot+=a[i];
continue;
}
tot=a[i];
cnt++;
}
if(tot>)
cnt++;
if(cnt<=m)
return ;
else
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
maxn=max(maxn,a[i]);
}
int l=maxn;
int r=sum;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid))
ans=mid,r=mid-;
else
l=mid+;
}
printf("%d",ans);
return ;
}

二分写法二:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int n,m,cnt,tot;
int l,r,ll,rr;
int a[maxn];
bool check(int x)
{
tot=;cnt=;
for(int i=;i<=n;i++)
{
if(tot+a[i]<=x)
{
tot+=a[i];
continue;
}
tot=a[i];
cnt++;
}
if(tot>)
cnt++;
if(cnt<=m)
return ;
else
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
ll=max(ll,a[i]);
rr+=a[i];
}
l=ll;r=rr;
while(l<r)
{
int mid=(l+r)/;
if(check(mid))
r=mid;
else
l=mid+;
}
printf("%d",l);
return ;
}

JDOJ 2225 工资计划的更多相关文章

  1. vijos1710 Mrw的工资计划

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...

  2. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...

  3. 评点SAP HR功能及人力资源管理软件

    评点SAP HR功能及人力资源管理软件   本文导航 第1页:my SAP 人力资源软件 第2页:my SAP HR协同功能 第3页:组织结构管理 第4页:mySAPTM HR的战略功能 第5页:集成 ...

  4. 实战java虚拟机的学习计划图(看懂java虚拟机)

    啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深 ...

  5. 如何用分析函数找出EMP表中每个部门工资最高的员工

    EMP表是Oracle测试账户SCOTT中的一张雇员表,首先,我们来看看emp表的数据 SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE ...

  6. 2014总结&2015计划

    2014总结&2015计划 今天是2015/1/1,新的一年终于到来了,昨天老板要求提交2014的工作总结和2015的工作计划,正好提醒我,要总结和计划了. 先回顾2014年初的计划: 新年计 ...

  7. HDU--杭电--4502--吉哥系列故事——临时工计划--背包--01背包

    吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  8. 工资不高也要给自己放假 这几款APP估计你用得上

    我是这样的一个人,我宁愿工资不高,只要给我足够的假期,那我就满足了.都说上班就是为了赚钱,但如果身体不好,赚再多的钱也是无福享受,所以建议各位,有机会的话,一定要抽出时间去旅游,去放松. 现在我们外出 ...

  9. HTML5-前端开发很火且工资很高?

    前言 晚上逛论坛看到一篇对从事HTML5前端开发的文章写的非常不错,和目前的市场形势差不多,然后我在其基础上给大家进行加工总结一下分享给大家.今天我们谈论的话题是<<为什么从事HTML5前 ...

随机推荐

  1. CentOS单机安装FastDFS&整合Nginx

    单机安装 一 准备工作 准备linux服务器或虚拟机,这里是虚拟机,操作系统CentOS 6.4 Tracker 和 Storage 安装在一台机器上 FastDFS 5.08版本 1,准备软件 软件 ...

  2. HikariCP连接池

    1.HikariCP连接池是什么? HikariCP是数据库连接池,而且是号称史上最快的,而且目前来看确实是这样的,SpringBoot2.0也已经采用HikariCP作为默认连接池配置. githu ...

  3. HTML连载40-盒子宽度和高度的练习、box-sizing属性

    一.判断方法 1.判断是否元素宽高为200的盒子 只需要看:边框+内边距+内容宽度/内容高度的值是否等于200 2.判断是否内容宽高为100的盒子 只需要看:width和heght的值是否等于100 ...

  4. mysql-新增数据表

    新增数据表之前,需确保已经存在数据库,如还没有数据库请先参考上一篇文章新增数据库 1.创建表  create table test( id  int PRIMARY KEY, name  varcha ...

  5. IL 语法分析

    Managed Heap: GC auto manage. One process, One heap. Call Stack: Runtime auto manage, every time whe ...

  6. Restful服务应不应该在URI中加入版本号

    程序员们对于Restful服务应不应该在URI中加入版本信息的问题在stackoverflow上进行了积极的讨论: Best practices for API versioning ,该问题被赞了7 ...

  7. jvm的组成入门

    JVM的组成分为整体组成部分和运行时数据区组成部分. JVM的整体组成 JVM的整体组成可以分为4个部分:类加载器(Classloader).运行时数据区(Runtime Data Area).执行引 ...

  8. WPF通过不透明蒙板切割显示子控件

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...

  9. QT 使用QSetting读取配置文件中的中文乱码解决方案

    windows下方案: 首先需要将ini文件改成UTF-8或GB2312编码格式,可以通过notepad++工具实现.然后在配置项中填入中文,如下: 接着在程序中使用 QSettings settin ...

  10. vue中嵌套的iframe中控制路由的跳转及传参

    在iframe引入的页面中,通过事件触发的方式进行传递参数,其中data是一个标识符的作用,在main.js中通过data进行判断,params是要传递的参数 //iframe向vue传递跳转路由的参 ...