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. Bootstrap分页查询

    前台方法: function show() { $('#reportTable').bootstrapTable({ method: 'get', url: "@Url.Action(&qu ...

  2. [东西]neverOpen

    一.介绍 用于完成一项光荣而伟大的使命. 二.更新日志 当前版本:V5.0 - 20191107 --------------------------------------------------- ...

  3. A1029 Median (25 分)

    一.技术总结 最开始的想法是直接用一个vector容器,装下所有的元素,然后再使用sort()函数排序一下,再取出中值,岂不完美可是失败了,不知道是容器问题还是什么问题,就是编译没有报错,最后总是感觉 ...

  4. Introduction to Semidefinite Programming (SDP)

    https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-251j-introduction-to-mathe ...

  5. QFile 打开文件,不用先判断文件名是否为空,做这多余的工作

    void test_file() { QFile file(""); if (!file.open(QIODevice::WriteOnly)){ qDebug()<< ...

  6. [NewLife.XCode]实体工厂(拦截处理实体操作)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  7. jvm 性能调优工具之 jmap

    概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 finalizer 队列. jmap ...

  8. Jenkins安装第一个插件和通过离线安装包进行安装

    1.打开左侧Manage Jenkins 选择Manage Plugins菜单 2.搜索Folders插件,该插件用于创建一个目录 3.点击安装进入插件安装状态,Jenkins会自动下载相关联的插件 ...

  9. 明解C语言 入门篇 第十一章答案

    练习11-1 /* 用指针实现的字符串的改写 */ #include <stdio.h> int main(void) { "; printf("p = \" ...

  10. 一个jetty部署多个项目配置之方法一

    https://my.oschina.net/wangyongqing/blog/115647 Jetty用户经常想配置他们的web应用到不同的虚拟主机. 通常情况下,一个单一的IP地址的机器有不同的 ...