zoukankan      html  css  js  c++  java
  • 【nynu】 妹妹的工资怎么算(二分)

    题目链接: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 //  //为拿工资

    又是最大最小,果断二分。之前还考虑怎么满足让连续子串和 = 二分的答案,其实不用,因为就算尺取出结果不符,也没办法判断下一步二分是大还是小,所以只考虑m就可以了。果然是签到题,手慢无( •̥́ ˍ •

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N = 100004;
    LL a[N], n, m;
    bool ok(LL x)
    {
        LL sum = 0, c = 0;
        for(LL i = 1; i <= n; i++)
        {
            if(sum + a[i] > x)
            {
                c ++;
                sum = 0;
            }
            sum += a[i];
        }
        if(c < m) return 1;
        return 0;
    }
    int main()
    {
        LL l = 0, r = 1e9;
        scanf("%lld%lld", &n, &m);
        for(LL i = 1; i <= n; i++)
        {
            scanf("%lld", &a[i]);
            l = max(a[i], l);
        }
        while(l <= r)
        {
            LL mid = (l+r)>>1;
            if(ok(mid))
                r = mid - 1;
            else
                l = mid + 1;
        }
        printf("%lld
    ", l);
        return 0;
    }
  • 相关阅读:
    代码编译时JDK版本和运行时JDK版本不一致启动项目报错
    Apache 环境变量配置
    Android NDK 环境变量配置
    Android SDK 环境变量配置
    JAVA 环境变量配置
    FFmpeg Download
    JAVA SE Download
    VS 2015 Download
    BASS HOME
    C++11的闭包(lambda、function、bind)
  • 原文地址:https://www.cnblogs.com/lesroad/p/9558804.html
Copyright © 2011-2022 走看看