zoukankan      html  css  js  c++  java
  • 经典的二分

    题目描述

    http://47.93.252.151/problem.php?id=1148

    《我的妹妹哪有这么可爱!》中的女主叫做高坂桐乃,高坂家的幺女,外表出众、成绩优秀、运动万能的少女,而且还兼职流行杂志的专属模特。阳光的外表下却有着特别的兴趣,是个在意周围眼光的御宅族,喜欢妹系的成人游戏和动梅露露的动画。桐乃有很多的工作,这次她有接到一个模特工作,这次一共工作n天,每天的工资为vi 有m个结算工资的日子,因为桐乃还是初中生所以她可以任意挑选m天来拿工资,但是桐乃每次不想拿太多的钱,所以她想计划使她一次性拿的钱中的最大的最小,(最后一天一定要拿工资)但是她不会分配日子,按照惯例,她找来了哥哥京介进行“人生咨询”,想让哥哥帮忙解决这个问题,哥哥也不怎么会,但是哥哥怎么会拒接妹妹的请求呢,所以他来拜托你解决这个问题。

    输入

    第一行 两个数 n ,m(m<=n<=100000)

    第二行 n个数,vi   (vi<100000)

    输出

    一个数表示答案

    样例输入

    5 3
    1 2 3 4 5

    样例输出

    6

    提示


    解释:1 2 3// 4// 5 //  //为拿工资

     

    要使一次性拿的钱中最大值最小,不能考虑平均,因为每天工钱都不一样,那么如果不考虑拿钱次数,每天过后都拿

    那么答案是其中的最大值,现在还有拿的次数,那么答案肯定比最大值大,答案上限是这些钱的总和

    那么我只能一个个的从最大值到总和之间枚举每一个答案,看是否能分成功

    但这样太慢了,这才考虑到二分

     

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll a[100002];
    int main()
    {
        ll n,m,l=0,r=0;
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            l=max(a[i],l);//左边界为工钱中最大值 
            r+=a[i];// 右边界为工钱总和 
        }
        
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            ll c=1,s=0;
            for(int i=0;i<n;i++)//看二分出来的答案可以分几次 
            {
                if(s+a[i]>mid)
                {
                    s=0;
                    c++;
                }
                s+=a[i];
            }
            if(c>m) l=mid+1;//如果可以分的次数太多了 
            else r=mid-1; 
        }
        printf("%lld
    ",l);
     } 

     

  • 相关阅读:
    非易失性存储器EEPROM
    NAND FLASH系统的权衡利弊
    Python爬虫爬取爱奇艺电影片库首页
    xpath解析爱奇艺电影网页数据
    BeautifulSoup 库 和 re 库 解析腾讯视频电影
    《人月神话》读书笔记(一)
    Python爬取腾讯视频电影名称和链接(一)
    配置腾讯云轻量级linux服务器用到的资源和步骤
    CSS样式中的各种居中方式
    CSS浮动---float
  • 原文地址:https://www.cnblogs.com/wpbing/p/9558365.html
Copyright © 2011-2022 走看看