首页 > 其他分享 >7.月度开销

7.月度开销

时间:2023-08-04 10:44:31浏览次数:21  
标签:开销 min int sum value 分组 月度

【题目】
农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 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为最大单月,将其暂时作为上限,尝试划分,那么1月+2月=500没有超,3月+4月=400没有超,5月=500,6月=101,7月=400,分组5个符合要求,最大就是500。

实际上可以转化为一个二分查找的问题,查找可以包含其他月的最小的最大值的分组,且分组数不能超过既定的值。

 

【代码】

  public static int coupons(int n, int m, int[] value) {
        // min 一天最大开销(单独作为一个月)最好情况
        // sum 所有天开销累加(所有天作为一个月)最坏情况
        int min = 0;
        int sum = 0;
        // 遍历value 计算min和sum
        for (int i : value) {
            min = Math.max(min, i);
            sum += i;
        }
        // 二分查找,边界从单月最大开销(min)最好情况 到所有月总和(sum)最坏情况
        return binSearch(sum, min, m, n, value);
        //最大值最小化问题,
        //思路:贪心+二分(在[min,sum]区间中二分,拿到的值t(假设当前值为最优解即最几个分组的最大值)进行判断:
        //遍历数组,如果累加值小于t就继续遍历直到大于t,cnt++,
    }

    //二分
    public static int binSearch(int sum, int min, int m, int n, int[] value) {
        int l = min;
        int r = sum;
        while (l < r) {
            int mid = (l + r) / 2;
            //判断如果mid可以满足,那么还能更小,在二分的左边
            if (judge(mid, sum, m, n, value)) {
                r = mid;//mid暂时是最优解,所以要包括在内
            } else {
                //判断如果mid不可以满足,分组数要大于给定值,最优解更大,在二分的右边
                l = mid + 1;
            }
        }
        return r;
    }

    public static boolean judge(int min, int sum, int m, int n, int[] value) {
        // count记录分组的数量;
        int count = 0;
        // temp保留每次的累加值
        int temp = 0;
        for (int i = 0; i < n; i++) {
            //分组个数大于等于m必定无最优解
            //(等于也算因为cnt已经等于目标分组数,还没分完就超了),小于m才可能有最优解
            if (count >= m) return false;
            // 如果当前遍历那一天的开销累加之前的比单月的最大开销还小,那么还能包含在一个月内,累加
            if (temp + value[i] <= min) {
                temp += value[i];
            } else {
                //否则 已经超出了单月最大开销,那么将这一天的开销作为新的一个月起始 并增加一个分组
                temp = value[i];
                count++;
            }
        }
        return true;
    }

 

标签:开销,min,int,sum,value,分组,月度
From: https://www.cnblogs.com/End1ess/p/17605276.html

相关文章

  • 高性能网络SIG月度动态:virtio新设备进入virtio规范、smc新特性IPC性能比tcp提升88% |
    高性能网络SIG:在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演者前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网络兴趣组致力于利用XDP、R......
  • 高性能存储SIG月度动态:DSMS开始适配Anolis OS、将在ANCK 5.10中支持ublk | 龙蜥 SIG
    高性能存储技术SIG目标:高性能存储技术兴趣组致力于存储栈性能挖掘,当前主要聚焦内核io_uring技术优化异步IO性能,使用持久化内存提升业务单成本性能,容器场景存储技术优化等课题。期望通过社区平台,打造标准的高性能存储技术软件栈,推动软硬件协同发展。 01本月SIG......
  • 高性能网络SIG月度动态:virtio-net 支持动态中断调节,SMC v2 协议增加新扩展
    高性能网络SIG(SpecialInterestGroup):在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演者前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网......
  • java时间工具类型,格式化时间,最近7天 月初 月末 季度 月度 时间格式化
    常用java时间格式化:packagecom.tz.util;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;/***时间工具类最近7天月初月末季度月度时间格式化等等……**@description时间工具类*@author:tz*@dtate:......
  • 22年12月Tita 升级年度考核中支持引入季度、月度考核的结果
    升级快速一览:·【考核模板】年度考核中支持引入季度、月度考核的结果;·【考核管理】支持单个考核活动中按分数计算考核排名; 点击免费领取绩效考核模版等资料1.  年度考核中支持引入季度、月度考核的结果使用场景:1.当做年度考核时,需要引入本年内每个季度或者每个......
  • 【月度刷题计划同款】经典 LCS 问题
    题目描述这是LeetCode上的522.最长特殊序列II,难度为中等。Tag:「LCS」、「最长公共子序列」、「序列DP」、「枚举」、「动态规划」给定字符串列表 strs,返回其中最长的特殊序列。如果最长特殊序列不存在,返回特殊序列定义如下:该序列为某字符串独有的子序列(即不能是其......
  • 流量劫持 —— GZIP 页面零开销注入 JS
    前言HTTP代理给页面注入JS是很常见的需求。由于上游服务器返回的页面可能是压缩状态的,因此需解压才能注入,同时为了节省流量,返回下游时还得再压缩。为了注入一小段代码,却将整个页面的流量解压再压缩,白白浪费大量性能。是否有高效的解决方案?本文从注入位置、压缩格式、校验算法......
  • 龙蜥社区 5 月度运营大事件回顾
    各位龙蜥社区的朋友们,你们好!5月运营月报来啦!从龙蜥看点、龙蜥生态、龙蜥活动、龙蜥SIG月度动态、精彩内容推荐等几方面总结、回顾了5月发生的重要事件。以下是社区运营报告,也欢迎更多的开发者加入,与我们一起打造面向云时代的操作系统。......
  • 小密圈月度总结
    阅读本文大概需要3分钟。今天是个好日子,国足赢了韩国,也是我小密圈创建一个月整的日子,看完国足,发篇文章出来。我在体验了小密圈半年之久之后,2017年2月23日我创建了自己的小密圈,至今为止刚好一个月,这里写个月度总结吧。小密圈刚创建的时候,我第一印象就想到了在公众号上主动赞......
  • 请问Pandas怎么能把类似201001这种月度格式改为2021-01-31这种日期格式
    今日鸡汤落叶人何在,寒云路几层。大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【老松鼠】问了一道Pandas时间处理的问题,如下图所示。二、实现过程一开始以为只是每个数据先加个31后缀,之后日期格式化转换一下应该就可以了,后来发现每个月天数不一样,不可以一概而论,......