06:月度开销

简介: 题目链接:http://noi.openjudge.cn/ch0111/06/ 总时间限制: 1000ms 内存限制: 65536kB描述  农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。

题目链接: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(),嗯代码注释讲的很清晰,不说了。

 

相关文章
|
9月前
1243:月度开销 2020-12-27
1243:月度开销 2020-12-27
|
4月前
|
人工智能 算法 搜索推荐
某国有银行业务收益提升30倍,它究竟是怎么做到的!
在激烈的银行竞争环境下,释放存量客户的复购潜力成为关注的重点。然而,目前银行销售理财产品过程中存在一系列问题,其中一个主要原因是过度依赖理财经理的个人经验。国有银行也难以避免这些问题在目标客户定位和营销执行过程中的出现。
|
9月前
|
存储 Cloud Native 前端开发
12-如何抗住双11一天几十亿的订单量?JVM该如何设置内存?
通过之前相关JVM的基础知识学习我们可以结合一些实际生产案例来进行结合巩固和说明,我们在上线一个生产系统的时候,针对预估的并发压力,到底应该如何合理的给出一个未经过调优的比较合理的初始值。 另外我们会分析各种参数在设置的时候有哪些考虑的点,Java堆内存到底需要多大?新生代和老年代的内存分别需要多大?永久代和虚拟机栈分别需要多大?这些我们都会结合案例来一步一步的分析。 注意:JVM参数到底该如何设置,一定是根据不同的业务系统具体的一些场景来调整的,不是说有一个通用的配置和模板,照着设就没问题了,这个思路是肯定不对的,一定要结合案例和业务场景来分析。
100 0
12-如何抗住双11一天几十亿的订单量?JVM该如何设置内存?
|
测试技术
关于系统用户数,并发用户数,在线用户数,吞吐量(摘)
关于系统用户数,并发用户数,在线用户数,吞吐量(摘)
202 0
|
Cloud Native 架构师 程序员
为什么团队规模越大,发布反而变慢了|学习笔记
快速学习为什么团队规模越大,发布反而变慢了
77 0
为什么团队规模越大,发布反而变慢了|学习笔记
|
开发者 iOS开发
苹果应用商店对满足条件的小型企业降低一半佣金,开发者怎么想?
苹果应用商店对满足条件的小型企业降低一半佣金,开发者怎么想?
|
存储 开发者
UPYUN 又拍云进行大幅度降价:数据量持续高速增长致成本降低
今天我们刚刚得到了SegmentFault 与开发者的好伙伴又拍云的官方消息,UPYUN(又拍云)进行了大幅度的价格调整。本次价格调整主要表现在存储空间和流量价格的全面下调,存储空间最高降价67%,流量最高降价40%。据了解,UPYUN本次进行价格调整的根本原因是过去一年UPYUN平台数据量持续高速增长令整体成本降低所致。
140 0
|
存储 缓存 运维
OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?
OIL将存储空间抽象化,并与分布式缓存系统VCache配合,降低了Facebook视频延迟的同时,并减少了存储与计算开销。感谢赵化强、李东明完成本文技术审校。
232 0
OIL + VCache如何改善Facebook视频延迟 并减少存储和计算开销?
|
存储 弹性计算 NoSQL
突破内存应用瓶颈,让IT成本下降40%的秘诀
近两年5G、大数据、云计算一直为行业热点,数字化进程不断加速,全行业数据开始爆发式增长。面对数据的迅猛增长,企业一方面享受着数据化转型带来的红利,另一方面也承担着大内存运行实例的高额开支。传统内存面临挑战,持久内存方案开始受到了行业更多的关注。
突破内存应用瓶颈,让IT成本下降40%的秘诀
|
编解码 监控 Cloud Native
视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
2020 年初,疫情期间,在线教育迎来需求爆发。为了应对高流量,蓝墨加大了整合业界优质课程资源的力度,不断拓展自身的业务边界,在赢得机遇的同时,技术团队也面临了前所未有的挑战。
视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?

热门文章

最新文章