uva714-复制书稿

题目链接 http://acm.hust.edu.cn/vjudge/problem/19689

解题思路

寻找最小上界用二分法

打印方案时从右边(尾)尽量往左边(头)划分。段数不够的话,从最左边往右一个一个划分。

代码

#include<stdio.h>
#include<string.h>
//#define LOCAL
typedef long long ll;
int div, n;
ll book[505];
bool flag[505];
void Search(ll l, ll r)
{
    while(l<r) {
        bool flag1 = false;
        ll mid = (l+r)/2;
        ll sum = 0, divide = 1;
        for(int i=0; i<n; i++) {
            if(sum<mid && sum+book[i]<mid) sum+=book[i];
            else if(book[i]<mid){ divide++; sum=0; sum+=book[i]; }
                else { flag1 = true; break; }
        }
        if(flag1 || divide > div) l = mid+1;
        else r = mid;
    }
//    printf("%d\n", l);
    ll sum = 0;
    for(int i=n-1; i>=0; i--) {
        if(sum<l && sum+book[i]<l) sum+=book[i];
        else {
            sum = 0; flag[i] = true;
            sum+=book[i];
        }
    }
    int di=1; int pos=0; for(int i=n-1; i>=0; i--) if(flag[i]) di++;
    if(di != div)
         for(int i=0; i<n&&di!=div; i++) if(!flag[i]) { flag[i] = true; di++; }
    for(int i=0; i<n; i++) if(flag[i] && i!=n-1) printf("%lld / ", book[i]);
        else if(i!=n-1)printf("%lld ", book[i]); else printf("%lld", book[i]);
}
int main()
{
    #ifdef LOCAL
        freopen("data.txt", "r", stdin);
        freopen("ans.txt", "w", stdout);
    #endif
    int cases; ll sum = 0;
    scanf("%d", &cases);
    while(cases--) {
        memset(flag, 0, sizeof(flag));
        scanf("%d%d", &n, &div);
        for(int i=0; i<n; i++) { scanf("%lld", &book[i]); sum+=book[i]; }
        Search(0, sum);
        printf("\n");
    }
    return 0;
}
时间: 2024-11-07 15:57:39

uva714-复制书稿的相关文章

codevs 4310 复制书稿

4310 复制书稿 时间限制: 1 s 空间限制: 4000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三和第四本书给同一个人抄写. 现在请你设计一种方案,使得复制时间最短.复制时间为抄写页数最多的人用去的时间. 输入描述 Input Description 第一行两个整数m,k;(k≤m≤

复制书稿(动规)

[动态规划]复制书稿 Time Limit:1000MS Memory Limit:65536K Description 有M本书(编号为1,2,-,M),每本书都有一个页数(分别是P1,P2,-,PM).想将每本都复制一份.将这M本书分给K个抄写员(1<=K<=M<=500),每本书只能分配给一个抄写员进行复制.每个抄写员至少被分配到一本书,而且被分配到的书必须是连续顺序的.复制工作是同时开始进行的,并且每个抄写员复制一页书的速度都是一样的.所以,复制完所有书稿所需时间取决于分配得到最

白书 第九章 例 9.24 复制书稿 题解

题目解法: 题解 白书 第九章 例 9.24 复制书稿 题解,码迷,mamicode.com

复制书稿

[题目描述] 现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三和第四本书给同一个人抄写. 现在请你设计一种方案,使得复制时间最短.复制时间为抄写页数最多的人用去的时间. [输入描述] 第一行两个整数m,k;(k≤m≤500), 第二行m个整数,第i个整数表示第i本书的页数. [输出描述] 共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号.k行的起始编号应该从小到大

Laoj P1271 复制书稿

问题背景 动态规划入门-第20题 试题描述 现在要把m本有顺序的书分给k人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. 现在请你设计一种方案,使得复制时间最短.复制时间为抄写页数最多的人用去的时间. 输入格式 第一行两个整数m,k:(k≤m≤500)第二行m个整数,第i个整数表示第i本书的页数. 输出格式 共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号.k行的起始

POJ1505&amp;&amp;UVa714 Copying Books(DP)

Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 7109 Accepted: 2221 Description Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so called scri

Linux 将文件夹下的所有文件复制到另一个文件里

如何将文件夹/home/work下的文件复制到/home/temp里面? 使用命令: cp -R /home/work/* /home/temp *表示所有文件 但是/home/work 下的隐藏文件都不会被拷贝 更好的复制的方法是用"."代替"*"就好了. cp -R /home/work/.  /home/temp 将一个文件夹复制到另一个文件夹下,例如将/home下的work文件夹复制到temp下面 命令为: cp -R /home/work  /home/t

MySQL 主主复制

MySQL的主主复制就是两台 mysql 节点互为主从.搭建起来 mysql 主从,再来搭建主主复制就非常简单了. 视频链接:http://www.roncoo.com/course/view/658088f6e77541f5835b61800314083e 在原来主从的基础上做如下操作: 1.开启原从节点的 binlog 日志 2.原从节点创建读取副本的用户 3.在原主节点中让 master 指向从节点 4.在原主节点执行 start slave 命令 以上步骤即可完成主主节点的配置 下面有一

MySQL集群(二)之主主复制

前面介绍了主从复制,这一篇我将介绍的是主主复制,其实听名字就可以知道,主主复制其实就是两台服务器互为主节点与从节点.接下来我将详细的给大家介绍,怎么去配置主主复制! 一.主从复制中的问题 1.1.从节点占用了主节点的自增id 环境: 主节点:zyhserver1=1.0.0.3 从节点:udzyh1=1.0.0.5 第一步:我们在主节点中创建一个数据库db_love_1,在创建一个表tb_love(里面有id自增和name属性). create database db_love_1; use d

xshell复制粘贴

用户看到这个标题肯定会觉得小编脑子坏掉了,复制粘贴不就是Ctrl+C,Ctrl+V嘛,但是在xshell却不尽然. 现象: 在xshell界面中需要用到之前的一段代码,自然是选中,熟练的键入Ctrl+C,打算复制,可是再次键入Ctrl+V时,一点反应都没有,无论怎样尝试都是一样. 原因分析: 在xshell中,Ctrl+C 代表着中断当前指令,与WIndows中的复制的快捷键重复,所以才出现了上述的现象 解决方法 1. 使用xshell中的复制粘贴快捷键 复制:Ctrl+Insert 粘贴:Sh