UVA-714 二分

时间:2023-02-21 23:03:30

把可能的进行二分判断,判断的时候尽量向右取,一直取到不能去为止,这样才有可能成功分割。

判断是否可以把up作为最大值的代码:

bool judge(LL up){
    if(up < Big) return false; //Big是数组中最大值,如果up小于最大值是不可能成功划分的
    LL sum = 0;
    int cnt = 0;
    for(int i = 0; i < n; ){
        sum = 0;
        while(i < n){
            sum += a[i];
            if(sum <= up) ++i;
            else break;
        }
        ++cnt;
    }
    if(cnt <= k) return true; //成功划分
    return false;
}

值得注意的是,最后得到最小的最大值时应该如何划分,题目要求前面的尽量小,那么就从后面尽可能多的划分,但是不能只满足小于等于up,也要考虑到组成k个序列,不能让某些序列为空。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 500 + 5;
int a[maxn], vis[maxn];
int Big = -1; //Biggest number
int n,k; //Divid n numbers to k squences

bool judge(LL up){
    if(up < Big) return false;
    LL sum = 0;
    int cnt = 0;
    for(int i = 0; i < n; ){
        sum = 0;
        while(i < n){
            sum += a[i];
            if(sum <= up) ++i;
            else break;
        }
        ++cnt;
    }
    if(cnt <= k) return true;
    return false;
}

LL Binary_Search(LL x, LL y){ //[x,y]
    while(x < y){
        LL mid = x + (y - x) / 2;
        bool ok = judge(mid);
        if(ok) y = mid;
        else x = mid + 1;
    }
    return y;
}

int main(){
    int T;
    scanf("%d", &T);
    while(T--) {
        memset(vis, 0, sizeof(vis));
        LL sum = 0;
        Big = -1;
        scanf("%d%d",&n,&k);
        for(int i = 0; i < n; ++i){
            scanf("%d",&a[i]);
            sum += a[i];
            Big = max(Big, a[i]);
        }
        LL up = Binary_Search(1, sum);
        LL div;
        int cnt = 0;
        for( int  i = n-1; i >= 0;){
            div = 0;
            while(div <= up && i >= 0 && i + 1 >= k - cnt){
                div += a[i];
                if(div <= up) --i;
            }
            ++cnt;
            if(i >= 0) vis[i] = 1;
        }
        //print the answer
        for(int i = 0; i < n; ++i){
            if(i == n-1) printf("%d\n", a[i]);
            else printf("%d ", a[i]);
            if(vis[i]) printf("/ ");
        }
    }
    return 0;
}

如有不当之处欢迎指出!

UVA-714 二分的更多相关文章

  1. UVa 714 &lpar;二分&rpar; Copying Books

    首先通过二分来确定这种最大值最小的问题. 假设每个区间的和的最大值为x,那么只要判断的时候只要贪心即可. 也就是如果和不超过x就一直往区间里放数,否则就开辟一个新的区间,这样来判断是否k个区间容得下这 ...

  2. UVa 714 Copying Books(二分)

    题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the inventi ...

  3. UVa 714 Copying Books - 二分答案

    求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...

  4. UVA 714 Copying Books 二分

    题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...

  5. UVA 714 Copying Books 最大值最小化问题 (贪心 &plus; 二分)

      Copying Books  Before the invention of book-printing, it was very hard to make a copy of a book. A ...

  6. uva 714 - Copying Books(贪心 最大值最小化 二分)

    题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...

  7. UVa 714 Copying books 贪心&plus;二分 最大值最小化

    题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...

  8. UVA 714 Copying Books 抄书 (二分)

    题意:把一个包含m个正整数的序列划分成k个非空的连续子序列.使得所有连续子序列的序列和Si的最大值尽量小. 二分,每次判断一下当前的值是否满足条件,然后修改区间.注意初始区间的范围,L应该为所有正整数 ...

  9. 紫书 例题8-10 UVa 714 (二分答案)

    这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...

  10. UVA - 714 Copying Books (抄书)(二分&plus;贪心)

    题意:把一个包含m个正整数的序列划分成k个(1<=k<=m<=500)非空的连续子序列,使得每个正整数恰好属于一个序列(所有的序列不重叠,且每个正整数都要有所属序列).设第i个序列的 ...

随机推荐

  1. Audio 的一些小笔记

    1.在做项目的过程中,对于volume 我们有一个volume curve,就是 0~63 step,每个step对应一个dB值,例如0step对应-90dB, 63 step对应0dB.关于这个0d ...

  2. 如何使用百度音乐搜索接口API

    百度有开放音乐搜索的api 比如: http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$ http://b ...

  3. Sqli-labs less 39

    Less-39 和less-38的区别在于sql语句的不一样:SELECT * FROM users WHERE id=$id LIMIT 0,1 也就是数字型注入,我们可以构造以下的payload: ...

  4. 让Maven正确处理javac警告

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.1:compile (default ...

  5. TCP&sol;IP协议族&lpar;一&rpar; HTTP简介、请求方法与响应状态码

    接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...

  6. 树莓派&period;安装Samba环境

    适用于树莓派3 树莓派装好系统后, 为了方便传文件到树莓派, 建议使用Samba这类文件夹级别的应用, 比ftp方便多了 如果你想把树莓派变成Nas, Samba也是不可或缺的应用 通过samba服务 ...

  7. tomcat允许跨域请求:

    在springmvc-servlet.xml中配置 <mvc:interceptors> <bean class="com.read.api.pc.interceptor. ...

  8. PHP在foreach中对&dollar;value赋值无效,应该用 &OpenCurlyQuote;键’ 或者 &amp&semi;&dollar;value的形式

    首先我们看下这段代码: foreach ($data as$value) { $value['name'] = 'Hehe'; } $data中原始的数据为: array(1) { [0] => ...

  9. TP框架模板中默认值输出

    TP框架模板中默认值输出 我们可以给变量输出提供默认值,例如: {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例 ...

  10. centos 7使用yum安装docker容器

    使用yum命令即可安装 yum install docker 安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动: [root@localhost ~]# systemctl ...