码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-03 19:05:36      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:二分法   acm   1331   sdnu   

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 1 3 4 5

Sample Output

9

Hint

n ≤ 100,000, k ≤ n, ai ≤ 10^9
暑假第一次测验,师哥虐我们的题。以前没用二分做过题,真的!
“他希望这k天中虐菜花费RP最多的一天,花费的RP尽量少”说明,这题99%要用二分法了····师哥说,有时候别忽略了那1%的几率。总之,师哥给我们讲了,涨姿势了,代码:
#include<cstdio>
using namespace std;
int f[100010];
int n,k,sum=0,cnt;
int check(int rp){//测试最多RP时,需要几天虐完
    cnt=1;
    int x=rp;
    for(int i=0;i<n;i++){
        if(x>=f[i]) x-=f[i];
        else{
            cnt++;
            x=rp-f[i];
        }
    }
    if(cnt<k) return -1;
    else if(cnt==k)return 0;
    else return 1;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&f[i]);
        sum+=f[i];
    }
    int left=0,right=sum,RP=(left+right)/2;
    int ha=check(RP);
    while(ha){//寻找答案大致位置
        if(ha==-1) right=RP+1;
        else left=RP-1;
        RP=(right+left)/2;
        ha=check(RP);
    }
    for(int i=left;i<=right;i++){//寻找答案具体位置
        int ah=check(i);
        if(!ah){
            printf("%d\n",i);
            break;
        }
    }
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:二分法   acm   1331   sdnu   

原文地址:http://blog.csdn.net/a995549572/article/details/47260233

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!