06:月度开销

题目链接:http://noi.openjudge.cn/ch0111/06/

总时间限制: 1000ms 内存限制: 65536kB
描述
  农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。

  约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。

  约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。

输入
  第一行包含两个整数N,M,用单个空格隔开。
  接下来N行,每行包含一个1到10000之间的整数,按顺序给出接下来N天里每天的开销。
输出
  一个整数,即最大月度开销的最小值。

样例输入
7 5
100
400
300
100
500
101
400
样例输出
500
输入输出样例说明
  若约翰将前两天作为一个月,第三、四两天作为一个月,最后三天各自作为一个月,则最大月度开销为500。其他任何分配方案都会比这个值更大。

先看AC代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 int check(long *a,long N,long long mid,long M); 5 int main()
 6 {
 7     long N,M;
 8     long *a=NULL,i;
 9     long long left=0,right=0,mid=0;
10     int res;
11     12     scanf("%ld%ld",&N,&M);
13     a=(long*)malloc(N*sizeof(long));
14     memset(a,0,N);
15     for(i=0;i<N;i++)
16     {
17         scanf("%ld",&a[i]);
18         if(a[i]>left) left=a[i];
19         right=right+a[i];
20     }
21 
22     while(left<right)
23     {
24         mid=left+(right-left)/2;
25         res=check(a,N,mid,M);
26         if(res==1) right=mid;
27         else left=mid+1;
28     }
29     printf("%lld\n",left);
30     return 0;
31 }
32 
33 //假设最大月开销为mid,统计需要分成多少个月.然后看月的个数是否太多或太少
34 int check(long *a,long N,long long mid,long M)
35 {
36     long count=1,i,temp=0;
37     for(i=0;i<N;i++)
38     {
39         if(temp+a[i]<=mid) temp=temp+a[i];//把第i天归入到当前第count月
40         else if(a[i]<=mid)//可以独立成一个月
41         {
42             count++;//开始一个新的月
43             temp=a[i];
44             if(count>M) return -1;//最大月开销太小,导致分的组太多了。
45         }
46         else return -1;//最大月开销mid太小了,导致某些开销比较大的天单独构成一个月都不行。
47     }
48     if(count>M) return -1;
49     else if(count<=M) return 1;//最大月开销mid太大了,导致分的组太少了
50 }

思路说明:

题目的意思一定要理解清楚!!!“合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。”   “输出一个整数,即最大月度开销的最小值。

就是把所有天划分为若干个段,先求出每个段里面的数字之和,然后统计各段累加和的最大值,这个值要尽可能小。现在要找的就是这个“累加和的最大值”   最小可以是多少。

 首先,这个题目应该二分,因为解的区间是可以明确的,可以对该区间进行二分求的真正的解。

假设二分的区间left~right,其中left是n天开销中最大的那一个数字,right是n天开销的总和。  (设想一个极限情况,要使得每一个月开销尽量小,那么每一天都单独做一个月就好啦,于是这个时候的月开销最大值就是n天中每天开销最大的值,所以left可以取max(a1,......,an)。    再设想另一种极限情况,把所有天合并在一起组成一个月,那么这个时候月开销最大值就是sum(a1,a2,......,an),所以right取值就是n天的累加和。)

需要注意的一个地方是二分循环部分的代码:

1     while(left<right)
2     {
3         mid=left+(right-left)/2;
4         res=check(a,N,mid,M);
5         if(res==1) right=mid;
6         else left=mid+1;
7     }
8     printf("%lld\n",left);

其中left=mid+1这里必须加上1,否则可能会死循环的。

另外,输出值是left。这个地方也要特别注意。(请自己脑补为何是left吧)

关于子函数check(),嗯代码注释讲的很清晰,不说了。

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/5607503.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax传值controller怎么写,ajax如何传递参数给controller

前台&#xff1a;‘type‘ : ‘post‘,‘contentType‘ : ‘application/json;charsetUTF-8‘,‘data‘ : JSON.stringify(JsonObject),其中JsonObject就是你组装的JSON对象后台&#xff1a;RequestMapping(value "/query", method RequestMethod.PO…

mc服务器玩家无限掉线怎么办,服务器频繁掉线 求解

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Mods loaded: 37ModLoader 1.1mod_MinecraftForge 1.3.3.12mod_ModLoaderMp 1.1mod_NotEnoughItems 1.1.2mod_ReiMinimap v3.0_01 [1.1]mod_AnimalBikes AnimalBikes 1.9.0mod_BuildCraftCore 2.2.12mod_BuildCraftBuilders 2.2.12…

delphi中的copy,delete,pos和leftstr,RightStr的用法

copy举个例子&#xff1a;str : “123456”;str1 : Copy(Str,2,3);结果就是 str1 等于 234。Copy有3个参数&#xff0c;第一个是你要处理的字符串&#xff0c;第二个是你要截取的开始位置&#xff0c;第3个是截取位数。当你的第3个参数大于字符长度&#xff0c;那么效果就是取 …

js中报错 ajax不存在,AJAX

AJAX : Asynchronous JavaScript and XML 异步JavaScript和XML (XML更多的是被JSON格式替代使用)AJAX 只做一件事情&#xff1a;异步获取数据&#xff0c;更为重要的是还是JS对返回的数据进行操作。异步获取数据极大地改善web与用户的数据交互(如下图左侧为传统web,右侧为借…

nylon尼龙的来历

nylon 尼龙 在1938年&#xff0c;美国杜邦&#xff08;du pont&#xff09;公司用工业原料试制出的一种合成纤维&#xff0c;老板让职员们取一个好记又适用于各种语言的名字&#xff0c;结果就取成了这个nylon。先是作为商标&#xff0c;后来作为产品属名。 乙烯vinyl和人造丝r…

iOS开发内购图文教程

2015年最全的内购图文教程&#xff0c;首先是填各种资料&#xff0c;最后是代码&#xff0c;废话不多说&#xff0c;直接上图 第一部分协议 第一步.png第二步.jpg第三步.jpg第四步.png第五步.png第六步.png第七步.jpg第八步.jpg第九步.jpg第十步.pngCNAPS CODE 查询地址https:/…

cisco服务器维修,面向终端的AMP控制台的思科维护的排除列表更改

简介本文档介绍添加到思科维护的例外项的更改。思科维护的例外项由思科创建和维护&#xff0c;以便在面向终端的高级恶意软件防护(AMP)连接器和防病毒、安全或其他软件之间提供更好的兼容性&#xff0c;这些例外项可以添加到应用的新版本。作者&#xff1a;思科工程师Caly Hess…

服务器怎么用光驱装系统教程,使用光驱重装系统详细教程

电脑系统在用了很长一段时间后总会出现卡顿或者其他的问题&#xff0c;这时很多小伙伴后就会选择进行系统的重装&#xff0c;系统的重装也是有多种方法的&#xff0c;比如使用U盘进行重装&#xff0c;或者使用光驱&#xff0c;而今天小编要给大家分享的就是使用光驱重装系统的详…

struts2 Eclipse 中集成strust2开发框架实例

下面通过建立一个小的实例具体来说明Eclipse 集成struts2,以下实例采用的为 struts2 版本为 struts2 2.2.3.1 为应用. 1. 下载struts2的开发包 第一步: 在浏览器中输入 http://apache.org 第二步:在apche的页面项目中选择struct 点击连接进入相关页面 第三步: 点击download选择…

电脑电池,笔记本电池校正,教您怎样校正笔记本电脑电池

只要留个心&#xff0c;就会发现身边的很多人都在使用着笔记本电脑&#xff0c;不过笔记本电脑使用久了&#xff0c;电池可能会出现虚电的情况&#xff0c;导致我们的笔记本的续航时间变短了&#xff0c;这时候需要我们手动对笔记本电池进行校准&#xff0c;为此&#xff0c;小…

手机网站——自适应

最近自己做的手机网管的页面,在手机上显示的时候,总是要手动进行页面缩放,这样子一来.采用Opera和 safari 等手机浏览器的时候,页面变形得很厉害,第一次用领导到的Iphone的时候.页面字变得太小,要缩放才可以.参考了3g.163 Yahoo ,Live 的页面后,发现CSS并无太大的区别.所以不是…

苹果手机语音备忘录在哪_苹果手机的备忘录竟然还有这么多隐藏功能?以前不知道真是可惜了!...

使用iPhone手机的用户&#xff0c;不知道有没有仔细研究过手机自带的备忘录功能&#xff0c;它不仅仅只有备忘的功能哦&#xff0c;还有很多隐藏的小技巧&#xff0c;今天带大家一起来一探究竟吧&#xff0c;一起玩转手机的备忘录功能吧&#xff01;1.编辑排版在备忘录进行文本…

弹出框设置在页面居中

思路&#xff1a; 1.获取当前页面的高和宽、针对顶部和左侧的滑动距离。 2.将弹出框的位置设为绝对位置。 3.设置弹出框针对屏幕的左侧和顶部的距离。 代码&#xff1a; html &#xff1a; <div class"dialog"> ...... //模态框内容   </div> css: …

杂牌手柄模拟xboxone手柄_震了,Xbox One 精英手柄2代摸了一次就不舍得放下了

首发于机核网&#xff0c;作者xizongbu近日我有幸提前拿到了微软 Xbox One 的精英手柄2代&#xff0c;这款产品在 E3 2019 微软展前发布会上正式公开&#xff0c;相信不少追求操作极致体验的玩家早就望眼欲穿了。更多的定制空间&#xff0c;更细致入微的体验优化&#xff0c;Xb…

Microsoft Hololens开发上手(4)

磨刀不误砍柴功&#xff0c;我们总有一些小工程师&#xff0c;不了解全貌&#xff0c;不好好思考&#xff0c;上手就开始写代码&#xff0c;这种做法是非常不可取的。对于Hololens的开发也是一样。今天我们来重点看看Hololens里面的一些概念&#xff0c;比如Holograms, 坐标系,…

wo-27s管理员账户和密码_Mac管理员忘记密码怎么办?

在使用Mac电脑时&#xff0c;为了安全很多用户通常都会设置管理员密码。不过如果不小心忘记Mac管理员密码怎么办&#xff1f;幸运的是&#xff0c;有些方法可以重置Mac密码并重新获得访问权限。下面小编就教给大家几种重置用户密码的方法。未开启FileVault的用户方法一&#xf…

嵌入式linux调试技术

Android模拟器只能通过端口映射的方式使用kgdbserver调试程序。但开发板除了可以通过ip连接到kgdbserver外还可以通过串口进行连接。开发板同样也带了kgdbserver程序&#xff0c;可直接运行。 大多数开发人员认为kgdb是最好的内核调试工具。Kgdb除了提供类似的printk函数的日志…

电脑怎么彻底删除软件_电脑在使用的过程中如何彻底删除今日热点广告弹窗的方法...

电脑在使用的过程中如何彻底删除今日热点广告弹窗的方法在今日热点弹窗弹出来之后&#xff0c;我们在键盘上同时按下“CtrlAltDel”键&#xff0c;调出“任务管理器”&#xff0c;在任务管理器进程找到“今日热点”&#xff0c;我们右键点击“今日热点”选择“打开文件所在的位…

Spring基础学习笔记-Bean的基础知识

一、 Bean的定义&#xff0c;初始化&#xff0c;使用和销毁 二、ref指定依赖的三种模式 三、Bean的五种自动装配模式&#xff08;autowire&#xff09; 四、Bean依赖检查的4种模式:配合atuowire使用,dependency-check"" 五、集合的注入方式 六、管理Bean config.xml文…

不用电脑怎么设置苹果铃声_苹果手机怎么设置铃声?完整教程分享

很多人的苹果手机铃声设置的都是用原始默认的铃声&#xff0c;因为苹果手机不支持直接将音乐设置为铃声&#xff0c;而且大多数人不清楚苹果怎么换铃声。当然安卓系统就没有这个问题啦。但是苹果的默认铃声听久了也挺腻的&#xff0c;鉴于有不少粉丝在问苹果手机怎么设置铃声&a…