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);
     } 

     

  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/wpbing/p/9558365.html
Copyright © 2011-2022 走看看