SDNU 1331.Kick Veges' Ass(二分法)

Description

There are n veges stand in line, Albert_s plan to punish them since they are too weak. The picture following below shows one of the veges waiting to be kicked.

Now Albert_s plan to kick all the veges on days in order. Since Kick the vege costs him RP, and the final cost is equal to the max cost of one day on the days.

Albert_s wants to minimize the final cost, so how much RP he costs by following the rule above?

Input

The first line contains two integer ;

The second line contains space-separated integers , the elements of the array.

,,?

Output

A number indicating the answer.

Sample Input

5 2
2 1 3 4 5

Sample Output

9

Hint

Another vege is waiting to be kicked.

End:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

#define ll long long

const int maxn = 1e5+100;
int a[maxn];
int n, m;

bool c(ll x)
{
    ll cnt = 1, sum = 0;
    for(int i = 0; i<n;)
    {
        if(x >= sum+a[i])//用二分的方法来不断把菜的屁股一段一段踢掉
        {
            sum += a[i];
//            printf("i = %d, sum = %lld\n",i,  sum);
            i++;
        }
        else
        {
            sum = 0;//那一天不能踢那么多屁股,就从新的一天开始
            cnt++;//统计天数目
//            printf("sum = %lld, cnt = %lld\n", sum, cnt);
            if(cnt>m)return 0;//如果天数大于输入的天数,则返回0
        }
    }
    return cnt <= m;//必须要二分的结果小于输入的天数
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }
    ll lb = 0, ub = 1e14;
//    printf("lb = %lld, ub = %lld\n", lb, ub);
    while(ub>lb)
    {
        ll mid  = (lb+ub)/2;
        if(c(mid))ub = mid;
        else lb = mid +1;//之前的一个已经遍历过了,从下一个开始
//        printf("lb = %lld, ub = %lld\n", lb, ub);
    }
    printf("%lld\n", ub);
    return 0;
}

SDNU 1331.Kick Veges' Ass(二分法)

原文地址:https://www.cnblogs.com/RootVount/p/10427965.html

时间: 2024-11-04 05:27:49

SDNU 1331.Kick Veges' Ass(二分法)的相关文章

SDNU 1331.Kick Veges&#39; Ass【SDNU2015暑期集训队测验I】【二分法】【8月3】

Kick Veges' Ass Description 有n个菜鸟站成一排,Jason要按顺序虐他们一下.虐第i个菜鸟需要花费掉A[i]点RP,现在Jason打算分k天虐完这些菜鸟.Jason每天的RP总数是固定的,为了使RP最低的时候不会过低导致杯具,他希望这k天中虐菜花费RP最多的一天,花费的RP尽量少.求Jason在花费RP最多那天花费了了多少RP. Input 第一行两个正整数n,k. 第二行为此数列A[i]. Output 一个数,为题目所求答案. Sample Input 5 22

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

Python写个二分法查找

笔者是一个通信测试攻城狮,之前做过一段时间的持续集成.工作内容只要就是对主线版本进行基本通信功能守护,测试执行都是自动化完成,也是那个时候开始接触到代码. 当时经常遇到的一个问题是:某一天我们发现版本有重大BUG,但是到上一次我们验证PASS中间已经经历过很多版本,我们需要手动从中间找到第一个出现BUG的版本,当然最简单的方法是二分法,取中间版本,根据有没有BUG再缩小范围,继续取中间版本...当时我的想法就是思路很固定,完全可以自动化完成,可惜当时我不会写代码...直到今天看Python递归函

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

puppet kick使用详解

当我们配置完puppet服务器端和客户端后,客户端会默认半个小时跟服务器端同步,如果我们需要更新重要文件,是不是得立即生效呢,那有什么好的办法吗?答案:有! 在服务器端使用puppetrun这个命令可以给客户端发送一段信号,告诉客户端立刻跟服务器同步,这样就达到我们的目的了!那怎样配置呢? (1).修改客户端上的puppet的配置文件 vi /etc/puppet/puppet.conf 在[agent]后面添加 listen = true  //这个是让puppet监听8139端口. (2).

二分法练习1

在房神的激励下我开始预习二分法啦~ poj3273 Monthly Expense (二分,最大值最小化) 题意:将N个账款分割成M个财务期,使得每个分期账款和的最大值最小. 题解:贪心思想,二分法.上界为N天花费总和,下界为每天花费的最大值.根据mid值遍历n天花费看是否满足M各财务期条件 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int main(){ 5 int n,m,i,cnt,a[

LeetCode 1 Two Sum(二分法)

题目来源:https://leetcode.com/problems/two-sum/ Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1

03-1. 二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根:否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环:

二分法排序

算法思想简单描述: 在插入第i个元素时,对前面的0-i-1元素进行折半,先跟他们 中间的那个元素比, 如果小,则对前半再进行折半,否则对后半 进行折半,直到left>right, 然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上. 二分法排序最重要的一个步骤就是查找要插入元素的位置, 也就是要在哪一个位置上放我们要准备排序的这个元素. 当我们查找到位置以后就很好说了,和插入排序一样, 将这个位置以后的所有元素都向后移动一位.这样就实现了二分法排序. 然后是怎么