uva 714 – Copying Books(贪心 最大值最小化 二分)

uva 714 – Copying Books(贪心 最大值最小化 二分)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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

这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值。怎样确定这个x就是用的二分法,x一定大于0小于全部值的合,不断的二分再推断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失那个值还特意去保存,其实二分法最后结束得出来的x或y(二个数是相等的)就是每份的最大值。而怎样确定这个最大值是否成立就是用贪心的方法,尽量的往右边拓展直到大于最大值的前一个为止。假设份数还没分完就到最后一个了,那就肯定是成立的。反之,假设份数分完了还没到最后一个那就是不成立。

输出的时候还得注意,得从后往前,由于前面的份数得要小,就得从后往前贪心,还有当剩余的跟份数一样的时候就不能贪心了,就要每个都要分开了。这个就自己模拟数据看吧,加一减一的都得跟前面写的有关系。

还有两点要特别注意, 求和的时候会超int范围,由于一个最大可达1×10^8,而最多有500个,超过了4×10^9了。所以要用long long。另一点是输出的时候最后一个数字后面不能多打一个空格不然会报PE的。

AC代码:

#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<ctime>
using namespace std;
#define NMAX 505
#define ll long long
int a[NMAX];
int ans[NMAX];
int solve(ll Max,int n,int k)
{
    int i=0,j=0,nct=0;
    ll sum=0;
    while(nct < k)
    {
        sum+=a[j];
        if(sum > Max && i == j) return 0;
        if(sum > Max)
        {
            nct++;
            i = j;
            sum = 0;
        }
        else j++;
        if(j == n) return 1;
    }
    return 0;
}

void path(ll Max,int n,int k)
{
    int nct = 0,i=n-1;
    ll sum=0;
    while(i>0)
    {
        sum+=a[i];
        if(sum > Max)
        {
            sum = 0;
            ans[i] = 1;
            nct++;
        }
        else i--;
        if(i == k-nct-2)
        {
            for(int j = 0; j <= i; j++)
                ans[j] = 1;
            break;
        }
    }
    for(int i = 0; i < n; i++)
    {
        if(i == n-1) printf("%d",a[i]);
        else printf("%d ",a[i]);
        if(ans[i]) printf("/ ");
    }
    printf("\n");
}

int main()
{
    int i,n,k,m;
    scanf("%d",&n);
    while(n--)
    {
        memset(ans,0,sizeof(ans));
        scanf("%d%d",&m,&k);
        ll sum = 0;
        for(i = 0; i < m; i++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        ll x=0,y=sum,z;
        while(x<y)
        {
            z = x+(y-x)/2;
            if(solve(z,m,k))
                y = z;
            else x = z+1;
        }
        path(x,m,k);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux抓包怎么查看数据包_shell curl获取返回数据

    linux抓包怎么查看数据包_shell curl获取返回数据(1)想要截获所有210.27.48.1的主机收到的和发出的所有的分组:#tcpdumphost210.27.48.1(2)想要截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):#tcpdumphost210.27.48.1and(210.27.48.2or210.27.48.3)(3)如…

    2022年10月14日
    5
  • ES5详解_es6配置表

    ES5详解_es6配置表目录1严格模式1.1使用1.2严格模式的作用1.3严格模式的规定2JSON2.1**`JSON.parse`**2.2`JSON.stringify`3对象扩展3.1Object.create3.2Object.defineProperties3.3对象本身的方法3.4Object.keys4数组扩展4.1indexof/lastIndexOf4.2forEach4.3map4.4filter5函数扩展1严格模式1.1使用在JS文件的头部或者函数的

    2025年7月22日
    5
  • python encode和decode函数说明_python中文处理之encode/decode函数「建议收藏」

    python encode和decode函数说明_python中文处理之encode/decode函数「建议收藏」python中文处理相信迷惑过不少同学。下面说说python2/3的encode和decode函数。python2中,使用decode()和encode()来进行解码和编码,以unicode类型作为中间类型。即decode  encodestr———>unicode———>str示例(注意encode和decode的编码必须保持一致)…

    2022年9月25日
    5
  • ARP欺骗攻击的检测和防御[通俗易懂]

    ARP欺骗攻击的检测和防御[通俗易懂]以太网构建由1500个字节的块组成的数据帧。每个以太网数据帧头包括源MAC地址和目的MAC地址。建造以太网数据帧,必须从IP数据包中开始。但在构建过程中,以太网并不知道目标机器的MAC地址,这就需要创建以太网头。唯一可用的信息就是数据包头中的目标IP地址。对于特定主机的数据包传输,以太网协议必须利用目标IP来查找目标MAC地址。这就是ARP地址解析协议。ARP

    2025年7月22日
    5
  • 13个免费资源网站,你想要的全都有!【各类宝藏资源,建议收藏】

    13个免费资源网站,你想要的全都有!【各类宝藏资源,建议收藏】前言前段时间,博主写了一篇文章关于如何用Python自制一款音乐播放器,有不少粉丝私信我说,这些高颜值UI设计模板都是从哪里找的,可以把网址分享出来嘛~当然没问题,今天就把多年收藏整理的各类资源网站全都分享出来,都是完全免费的“资源”网站,质量非常高,一起来看看吧!1.虫部落网址:https://search.chongbuluo.com功能特点:聚合搜索平台,集成了100多个搜索引擎,包含了搜问题、找图片、听音乐、下文档资料、查代码等等,各种需要这个网站都有。其中还包含了学术搜索引擎,非常适

    2022年7月17日
    77
  • PLSQL的使用「建议收藏」

    PLSQL的使用「建议收藏」PLSQL这个工具专门为oracle开发的(它只能连接oracle数据库)很多工具都可以连接oracle数据库(常用的有navicat、toad、plsql等)1.1 初次登录PLSQL

    2022年7月3日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号