首页 > 其他分享 >P1324 矩形分割

P1324 矩形分割

时间:2023-11-30 18:33:54浏览次数:38  
标签:std 分割 columnCutCosts int i64 ++ P1324 rowCutCosts 矩形

简单的贪心题。

因为要切成 \(1\times 1\) 的小方块,所以这 \((n-1)+(m-1)\) 条线的每条线都会挨一刀,只需要将顺序确定下来,就有可能计算出总代价。

贪心地考虑,对于同一侧来说,代价大的切割要尽早处理,否则一旦在另一个方向上进行了一次切割,这一刀的代价就会增加一倍,代价小的加倍总比代价大的加倍要优,所以我们可以直接把横、竖线切割的代价分别从大到小排序;而对于一横一竖两刀来说,同理应该先切代价大的。于是想到可以用两个指针按照上述方案同步扫描排序后的两个数组,统计答案。

因为“不能把两块木板拼起来切割”,所以每横着切一刀的费用 \(a_i\) 要乘一个系数,即 \(竖着切的刀数+1\);每竖着切一刀的费用 \(b_i\) 也要乘一个系数,即 \(横着切的刀数+1\)。不妨开两个变量,在指针扫描的同时统计两个方向各切了多少刀,即可统计出答案。

下面是 AC 代码:

#include <bits/stdc++.h>

using i64 = long long;

bool compare(int x, int y)
{
    return x > y;
}

int main()
{
    int n, m;
    std::cin >> n >> m;
    std::vector<i64> rowCutCosts(n - 1);
    std::vector<i64> columnCutCosts(m - 1);
    for (int i = 0; i < n - 1; i++)
    {
        std::cin >> rowCutCosts[i];
    }
    for (int i = 0; i < m - 1; i++)
    {
        std::cin >> columnCutCosts[i];
    }

    std::sort(rowCutCosts.begin(), rowCutCosts.end(), compare);
    std::sort(columnCutCosts.begin(), columnCutCosts.end(), compare);

    i64 sumCost = 0;
    int i = 0, j = 0;
    while (i < n - 1 && j < m - 1)
    {
        if (rowCutCosts[i] >= columnCutCosts[j])
        {
            sumCost += (i64)rowCutCosts[i++] * (j + 1);
        }
        else
        {
            sumCost += (i64)columnCutCosts[j++] * (i + 1);
        }
    }
    for (; i < n - 1; i++)
    {
        sumCost += (i64)rowCutCosts[i] * (j + 1);
    }
    for (; j < m - 1; j++)
    {
        sumCost += (i64)columnCutCosts[j] * (i + 1);
    }
    std::cout << sumCost << '\n';
    return 0;
}

注意输入数据是 \(n-1,m-1\) 个数!

THE END

标签:std,分割,columnCutCosts,int,i64,++,P1324,rowCutCosts,矩形
From: https://www.cnblogs.com/th19/p/17867860.html

相关文章

  • python图像中如何 绘制矩形,编辑文案,保存结果图片等操作
    python版opencv函数学习笔记-cv.rectangle()全参数理解cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)以下来自官方文档和自己的理解img:指定一张图片,在这张图片的基础上进行绘制;pt1:矩形的一个顶点;pt2:与pt1在对角线上相对的矩形的顶点;......
  • python计算两个矩形的重叠_python计算两个矩形框重合百分比的实例
    如下所示:defmat_inter(box1,box2):#判断两个矩形是否相交#box=(xA,yA,xB,yB)x01,y01,x02,y02=box1x11,y11,x12,y12=box2lx=abs((x01+x02)/2-(x11+x12)/2)ly=abs((y01+y02)/2-(y11+y12)/2)sax=abs(x01......
  • python利用with语句分割长函数代码块的小技巧
    如果某个函数实现很长,有时候希望把函数分割成若干部分,并且可以折叠,执行时能够打印日志.可以采用下面的办法来实现:frommylogimportloggerimporttimeclassMyTask:def__init__(self,task:str)->None:self.task:str=taskself.start_time......
  • PHP大文件分割上传详解
    这篇文章主要为大家详细介绍了PHP大文件分割上传,PHP分片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关upload_max_filesize=2M//PHP最大能接受的文件大小post_max_size=8M//PHP能收到的最大POST值'memory_l......
  • 2019年-fibonacci数列与黄金分割
    目录题目法一、递归法二、迭代题目法一、递归deffib(n):ifn==1orn==2:return1returnfib(n-1)+fib(n-2)n=int(input())a=fib(n)b=fib(n+1)print("{:.8f}".format(a/b))只通过了60%的测试法二、迭代#动态规划#deffib(n):#dp=[0]*(n+1)#......
  • LISA(推理分割)笔记
    title:LISA(推理分割)笔记banner_img:https://cdn.studyinglover.com/pic/2023/08/10f885319b150cc20093124185e25c3b.pngindex_img:https://cdn.studyinglover.com/pic/2023/08/ded90e7e3f84739b187dd679c39bd8dd.pngdate:2023-8-1815:05:00categories:-笔记tags:-......
  • python 将docx按页分割
    Python将docx按页分割在进行文档处理过程中,有时我们需要将一个大的docx文件按页分割成多个小文件,这样可以更方便地处理、管理和查看文档内容。本文将介绍如何使用Python来实现这个功能,并提供相应的代码示例。docx文档格式简介在开始介绍具体的代码实现之前,我们先来了解一下docx......
  • java如何分割字符串?
    在Java中,可以使用split()方法来分割字符串。split()方法接受一个正则表达式作为参数,根据该正则表达式将字符串分割成一个字符串数组。publicclassMain{publicstaticvoidmain(String[]args){Stringstr="Hello,World,Java";String[]parts=str......
  • PyTorch团队重写「分割一切」模型,比原始实现快8倍
    前言 我们该如何优化Meta的「分割一切」模型,PyTorch团队撰写的这篇博客由浅入深的帮你解答。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署......
  • 代码随想训练营第四十二天(Python)| 0-1 背包基础、416. 分割等和子集
    [背包基础]题目:有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。1、二维方式解决背包问题classSolution:defsolve_bag(self,weight,value,bag_weight):......