首页 > 其他分享 > U142792移动箱子 学习笔记

U142792移动箱子 学习笔记

时间:2022-12-24 19:22:56浏览次数:40  
标签:箱子 le 宝箱 U142792 ll 笔记 include 空箱

题意

n列箱子,其中有些是宝箱、其他是空箱。每一秒钟你可以选择以下操作执行:

  1. 将第i列最上面的一个箱子移动到第j列的最上面;
  2. 如果第i列最上面的一个箱子是宝箱,将其打开取出宝物,之后这个箱子消失;

你也可以理解成 n个栈,每次操作移动某个栈顶元素、或者删除某个位于栈顶的宝箱。

请问如果想打开所有宝箱,最少需要的操作次数。

对于 \(100\%\) 的数据,保证 \(1\le T\le 5, 1 < n\le 10^5, 0\le h\le 10^9, \sum{m}\le5\times 10^5\)。

思路

初步想法

首先做几次样例,可以发现本题好像可以使用贪心的思想。

建议读者先自己模拟几遍样例过程,找找规律再接着往下看。

通过模拟样例,我们大概可以初步想到,先搬空一列,之后每一个上方的空箱,就把它挪到这个空列中。

为什么这个贪心是对的呢?仔细想想,如果把所有的空箱来回来回挪很明显是不如只挪一列。

tips

上方只是一些初步想法,下面我们可以完善一些。

  • 每一列只有到最底下的一个宝箱和它的上方是有意义的

  • 选择挪走的宝箱挪动次数是 \(2*\text{空箱次}\),同时还要加 \(n\),注意空箱是从最底下的宝箱以上算的。

  • 其余的列只需要挪走有意义部分的长度次就可以做到了。

代码

#include<cstdio>
#include <set>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
using namespace std;
typedef long long ll;
const ll MAXN=1e8;
ll T,n,h,m,a;
int main(){
    scanf("%lld",&T);
    for (int t = 1; t <=T ; ++t) {
        scanf("%lld",&n);
        ll num=0,min_imp=0,ans=0,min_v=0x3f3f3f3f;
        for (int i = 1; i <=n ; ++i) {
            scanf("%lld%lld",&h,&m);
            ll Min=0x3f3f3f3f3f3f;
            for (int j = 1; j <=m ; ++j) {
                scanf("%lld",&a);
                Min= min(Min,a);
            }
            if(((h-Min+1)-m)<min_v){
                min_v=(h-Min+1)-m;
                ans-=num;
                ans+=min_imp;
                num=((h-Min+1)-m)*2+m;
                min_imp=(h-Min+1);
                ans+=num;
            }else{
                ans+=(h-Min+1);
            }
            //cout<<num<<" "<<min_imp<<" "<<ans<<endl;
        }
        cout<<ans<<endl;
    }
    return 0;
}

标签:箱子,le,宝箱,U142792,ll,笔记,include,空箱
From: https://www.cnblogs.com/tanghg/p/17003237.html

相关文章

  • SYSU-SSE 3D游戏编程与设计 学习笔记(6)--模型与动画
    智能巡逻兵游戏代码:游戏代码游戏演示视频:演示视频编程内容实现思路组织游戏资源,将地图、巡逻兵和玩家做成预制,其中巡逻兵和玩家模型来自于AssetStore玩家巡逻......
  • P3369普通平衡树 学习笔记
    题意写一棵平衡树,需要实现如下几种操作:插入\(x\)数删除\(x\)数(若有多个相同的数,因只删除一个)查询\(x\)数的排名(排名定义为比当前数小的数的个数\(+1\))查......
  • Spring IOC官方文档学习笔记(四)之依赖项(下)
    3.depends-on(1)depends-on用来表示一个bean的实例化依靠另一个bean的先实例化,如果在一个beanA上定义了depends-onbeanB就表示:beanA实例化前先实例化beanB。<!--......
  • 绿盟 2020年数据安全前沿技术研究报告 学习笔记2和下载地址
    多方​​数据安全​​的联合AI建模参考资料​​绿盟2020数据安全前沿技术研究报告​​数据驱动AI建模,一般来说,模型效果与训练数据的特征维度与样本规模密切相关。然而,在......
  • 联通 DevSecOps 实践白皮书 学习笔记和下载地址
    ​​联通DevSecOps实践白皮书2021​​概述数字化技术催生各行业的不断创新:ICT、媒体、金融、保险在数字化发展曲线中已经独占鳌头,零售、汽车、油气化工、健康、矿业、农......
  • 27款笔记软件的介绍
    [长文警告,鼠标移至文章标题,右边会显示按钮,点击可显示文章目录导航]初衷工欲善其事必先利其器。一开始是想找一款合适自己的笔记软件,因为随着记录的东西的增多,越来越觉得......
  • Docker学习笔记
    一、容器化技术相关概念1、容器化技术概念在软件开发过程中环境配置永远是最让人头疼的在开发之前我们需要准备各种运行环境、IDE及辅助工具同时软件部署也为程序员的谢......
  • Python学习笔记--从继承开始继续
    继承的基础语法单继承:多继承:一个子类继承多个父类pass关键字补全语法注意事项:复写和使用父类成员复写父类成员也就是相当于Java中的方法重写调用父类成员......
  • Python学习笔记--第二阶段啦
    初识对象示例:类的成员方法上图中的self必须填写!!!示例:类和对象有c和c++语言基础的话,就会发现其实是一样的道理,只是实现代码有差异构造方法(init)示例:注意:......
  • FreeSWITCH学习笔记:EventSocket
    本文更新于2022-12-20,使用FreeSWITCH1.10.7。目录apiauthbgapiconnectdivert_eventseventexitfilterfilterdeletelingerlogmyeventsnixeventnoeventnolingernologsendev......