2018 CodeM初赛A轮 下棋答案(B题) (第二道题)

迷宫问题代码(算法详解) *问题描述:一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示), * 要么是障碍物(用0 表示)。找出从起点到终点的最短移动序列,其中U,D,L,R, * 分别代表往上,下,左,右移动到相邻单元格。任何时候都不能在障碍格中, * 也不能走到迷宫之外,起点和终点保证是空地。n,m<=100. * *分析: 可以使用bfs,节点的访问顺序恰好是它们从根节点距离从小到大的顺序。类 * 似的,也可以用bfs来按照起点的距离顺序遍历迷宫图。不断沿着父亲指针走, * 保存方向序列dir,最后反向输出。 * 比深度优化的效率要高很多,因为每次都定义了活结点还有下一个扩展节点, * 在活结点当中去寻找扩展节点,不会盲目的搜索到底,而是有一定的选择性。 * 因此我们可以定义记录扩展节点的数组,并且定义函数来判断,看下一层将要 * 被搜索的节点是不是能够作为扩展节点。这就运用到了分支限界的知识。 * 立即下载

题目:

      有一个1*n的棋盘, 上面有若干个棋子,一个格子上可能有多个棋子,

      你每次操作是先选择一个棋子,然后选择一下两个操作中的一个:

           (1)若该棋子不在(1,1),让这个棋子往左走一格,即从(1,x)走到(1,x - 1);

          (2)若该棋子不在(1,n),且这个棋子曾静到达过(1,1),让这个格子往右走一格,即从(1,x)走到(1,x+1)。

     给定一开始每个各自上有几个棋子,再给定目标每个格子上上需要几个棋子,求最少需要多少次操作。

     输入:

         第一行一个正整数n表示棋盘大小。

         第二行n个非负整数a_1,a_2,。。。,a_n 表示一开始(1,i)上有几个棋子。

         第三行n个非负整数b_1,b_2,。。。,b_n 表示目标局面里的(1,i)上有几个棋子。

     输出:

        输出一个非负整数,表示最少需要几次操作。

例子:

     输入:

        5

        0  0  1  1  0

        1  0  0  0  1

     输出:

       9


题目分析:

  典型的贪心法问题,目标数组减去起始数组,得到的向量中,如果元素为负,表示拥有多余的棋子;如果元素为正,表示,需要额外棋子,根据操作的定义,我们可以想到最有的策略是:棋盘中最右边的多余的棋子,给最左边需要的额外的棋子,坐标的相减即为所需的操作次数,而遇到在多余棋子坐标右边的需要的棋子,就需要向左移到头,再向右移,所需的操作为两个点的坐标相加。

贪心总结三点:

  1、相差为0的元素,代表不移动

  2、目标需要棋子的坐标如果在含有棋子的坐标的右边,则需要移动到最左边,然后再向右移动

  3、目标需要棋子的坐标如果在含有棋子的坐标的左边,则只需要向左移动相应格子即可

而我们的贪心算法要尽可能是第三点的操作最多,则可满足题意。

  代码

  代码核心:定义两个队列,一个队列是拥有多余棋子的队列(这个队列是从右向左入队),另一个是需要棋子的队列(这个队列是从左向右入队),根据最有策略,列队入队的方向有所不同,注意队列还要保存坐标信息,当队首的棋子数为零则出队(这里的棋子数包括所需的棋子数或是多余的棋子数)。第二步就需要判断位置信息,利用位置来确定操作次数。代码如下:

//

//  main.cpp

//  codeM初赛2

//

//  Created by Mr Gao on 2018/6/9.

//  Copyright © 2018年 Mr Gao. All rights reserved.

//


#include <iostream>

#include <vector>

#include <queue>

using namespace std;

int main(int argc, const char * argv[]) {

    // insert code here...

    int n;

    cin>>n;

    if(n == 0)

        cout<<0<<endl;

    vector<long long> start(n);

    vector<long long> end(n);

    for(int i = 0; i < n; i++)

        cin>>start[i];

    for(int i = 0; i < n; i++)

        cin>>end[i];

    queue<pair<long long,int>> hasPiece;

    queue<pair<long long,int>> needPiece;

    for(int i = 0; i < n; i++){

        long long diff = end[i] - start[i];

        if(diff > 0)

            needPiece.push(pair<long long,int>(diff, i));

    }

    for(int i = n - 1; i >= 0; i--){

        long long diff = end[i] - start[i];

        if(diff < 0)

            hasPiece.push(pair<long long,int>(-diff, i));

    }

    long long ret = 0;

    while(!hasPiece.empty()){

        if(hasPiece.front().first >= needPiece.front().first && hasPiece.front().second > needPiece.front().second){

            ret += needPiece.front().first * (hasPiece.front().second - needPiece.front().second);

            hasPiece.front().first -= needPiece.front().first;

            needPiece.front().first = 0LL;

        }

        else if(hasPiece.front().first < needPiece.front().first && hasPiece.front().second > needPiece.front().second){

            ret += hasPiece.front().first * (hasPiece.front().second - needPiece.front().second);

            needPiece.front().first -= hasPiece.front().first;

            hasPiece.front().first = 0LL;

        }

        else  if(hasPiece.front().first >= needPiece.front().first && hasPiece.front().second < needPiece.front().second){

            ret += needPiece.front().first * (needPiece.front().second + hasPiece.front().second);

            hasPiece.front().first -= needPiece.front().first;

            needPiece.front().first = 0LL;

        }

        else if(hasPiece.front().first < needPiece.front().first && hasPiece.front().second < needPiece.front().second){

            ret += hasPiece.front().first * (needPiece.front().second + hasPiece.front().second);

            needPiece.front().first -= hasPiece.front().first;

            hasPiece.front().first = 0LL;

        }

        if(hasPiece.front().first == 0LL)

            hasPiece.pop();

        if(needPiece.front().first == 0LL)

            needPiece.pop();

    }

    cout<<ret<<endl;

    return 0;

}



MobaXterm终端工具个人学习版安装包及常用配置备份 资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。 立即下载

相关推荐

Type-C转DP1.4转C双向互传转接线方案

Type-C转DP双向互转方案的核心在于利用Type-C接口中的Alt Mode(交替模式)功能。通过利用Type-C接口的Alt Mode功能,该方案实现了Type-C接口与DP接口之间的双向互传,极大地丰富了用户的视觉体验。在选择Type-C转DP双向互转方案时,用户需要关注兼容性、性能需求、线缆长度和品牌等因素,以确保获得最佳的传输质量和使用体验。因此,Type-C转DP双向互转方案应运而生,旨在实现Type-C接口与DP接口之间的无缝连接,满足用户对高效能和高清晰度视频传输的需求。

m0_70875024的博客 4976

2020年9月3日百度笔试第二题

题目描述 一个N×NN×N的棋盘,每个格子填有1、2、3、4中的某一个。最开始在左上角放一个棋子,每次可以移动至上、下、左、右四个格子中的某一个,每次只能移动一格(允许重复移动到某一个格子),在任何时刻都不允许将棋子移除棋盘。在移动时需要进行计分。如果初始格子中的数字为X,目标格子中的数字为Y,则本次移动计分为|X - Y|。现在需要把棋子移动到右下角,求最小计分。 输入描述 第一行为nn 第二行到第n+1n+1行,为一个二维数组,表示棋盘上的每个格子对应的数字(正整数)。 1≤n≤1001≤n≤100

Ahub_Ha的博客 744

linux和mac安装+配置circos(

一定要下载完这两个包,GD才会work,要不然会报错,且-modules显示也是fail。官网的教程说的很明白,但是很多包都已经过时了需要在网上找。一般来讲,所有包的安装都不会太困难,除了GD。1.是因为官网给的链接下出来的tgz无法解压。2.我的电脑安装后GD照样是fail的。,进入这个地址下一个.tgz。第二点的原因在于,官网的情况。,进入这个地址,按部就班。GD安装困难有以下几点。搞了一天终于配置成功。

xiufan1的博客 551

2020.11.22考试棋盘游戏题解

状态压缩矩阵存储成数字,能减少空间分配,哈希转化,BFS扩展判断下边和右边即可,因为这样所有点都可以扩展到。在一个 4x4 的棋盘上有 8 个黑棋和 8 个白棋,当且仅当两个格子有公共边时,这两个格。移动棋子的规则是交换相邻的两个棋子。现在给出一个初始棋盘和一个。最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。第一到第四行每行 4 个数字(1 或者 0),描述初始棋盘。输出文件的第一行是一个整数 n,表示最少的移动步数。第六道第九行每行 4 个数字,描述最终棋盘。...

weixin_42178241的博客 1194

WorkVisual传输程序报错_发现一个内部错误

WorkVisual传输程序报错_发现一个内部错误

qq_16401025的博客 2457

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1)

本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行

weixin_55313207的博客 1363

URAL 1051 跳跳棋(孔明棋)(加强版) 数学找规律(较弱哦)

 跳跳棋(加强版)问题描述hty想到最近出过一道1*N的跳跳棋游戏,于是他想是否2维也能有很好的方法呢?于是有了下面这道题,题目如下:在一个无限大的棋盘的格子上有一些棋子,这些棋子构成一个M*N的矩形(M为高度,N为宽度)。你可以用一个棋子跳过另一个相邻的棋子,被跳过的棋子将被移去,请你求出最少能剩下几个棋子。输入文件本题有多组数据。对于每组数据,仅有一行,两个正整数M,N,最后一行M=N=0,无需处理此行数据。输出文件对于每组数据,一个正整数,表示最少剩下的棋子数。输入样例3 40 0输出样例2数据规

chenwenxiaocom的专栏 4069

电源完整性之Cadence Sigrity Power SI_AC阻抗仿真

之前和大家分享过电源完整性之仿真设计原理链接: [link](https://blog.youkuaiyun.com/weixin_41808082/article/details/117065140?spm=1001.2014.3001.5501).今天接着上一篇文章总结一下电源AC阻抗的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power SI组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power SI

刘小同学的博客 1万+

nyoj-146 跳棋jump (守恒定律)

隐蔽的平衡定律

狂飙的蜗牛 的专栏 1586

19、多项式基算术:原理与运算详解

本文深入探讨了有限域 $GF(2^m)$ 中的多项式基算术,详细介绍了加法、减法、乘法和平方运算的原理与实现方法。重点分析了多项式基表示形式、模约简技术以及乘法优化策略,如高基数乘法、并行与顺序乘法器设计,并提到了Karatsuba-Ofman算法在减少乘法次数方面的优势。此外,文章还讨论了多项式基算术在密码学、编码理论等领域的应用前景,并展望了未来在高效算法设计与硬件加速方面的研究方向。

yellow的专栏 150

【漏洞复现】永恒之蓝 MS17-010 远程溢出漏洞(CVE-2017-0143)

文章目录声明前言一、漏洞原理简述二、漏洞代码深层解析三、实验步骤四、漏洞补丁总结 声明 本篇文章仅用于技术研究与技术学习,切勿用于非授权下攻击行为,切记! 前言 Windows7 存在 MS17-010 永恒之蓝(远程溢出漏洞) ,该漏洞是方程式组织在其漏洞利用框架中一个针对SMB服务进行攻击的漏洞,该漏洞导致攻击者在目标系统上可以执行任意代码 一、漏洞原理简述 MS17-010漏洞出现在Windows SMB v1中的内核态函数 srv!SrvOs2FeaListToNt 在处理FEA(File Ex

李同學AI安全 9627

Niagara 5.3 核心模块实战:从 Emitter 到 Renderer 的 3 大性能优化策略

本文深入探讨了虚幻引擎5.3中Niagara粒子系统从Emitter到Renderer的三大核心性能优化策略。通过精准控制粒子生成速率、生命周期管理、GPU/CPU发射器选择,以及渲染器配置和材质优化,帮助开发者在不牺牲视觉效果的前提下提升系统性能。文章还提供了火焰特效的实战案例,展示如何通过综合优化实现帧率从28FPS提升至62FPS。

weixin_33875839的博客 503

Multica 自托管部署与使用入门:从上线到让 AI Agent 真正干活

Multica是一个将AI Agent作为团队成员的任务协作平台,支持自托管部署。本文介绍了完整的单机部署流程: 核心架构包括前端界面、后端服务、PostgreSQL数据库和Runtime执行机器 推荐使用Docker Compose部署,需配置数据持久化目录 提供详细的docker-compose.yml和.env配置文件说明 重点注意事项:数据库密码和JWT密钥必须修改,生产环境配置必须设为production 需正确配置前端访问地址和WebSocket连接 部署完成后,用户可创建AI Agent并将其

q742971636的博客 1710

【算法刷题】CodeM2018 初赛A轮 下棋

CodeM2018 初赛A轮  下棋   第二题[编程|1000分] 下棋 时间限制:C/C++ 1秒,其他语言 2秒 空间限制:C/C++ 262144K,其他语言 524288K 64bit IO Format: %lld 题目描述 有一个1*n的棋盘,上面有若干个棋子,一个格子上可能有多个棋子。 你每次操作是先选择一个棋子,然后选择以下两个操作中的一个: (1) 若该棋...

Neo_dot的博客 578

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

黑白棋题解

小爱可以按照任意顺序翻转任意数量的棋子,但游戏规则规定,选择翻动某一枚棋子时,与这个棋子的方格共享边界的其它棋子也必须被同时被翻转。小爱可能在一个步骤中,同时翻转五个棋子(棋子在中间)、四个棋子(棋子在边界上)或三个棋子(当棋子在角上)。(1,2)翻了一次(b[1][1]=1),变为1,所以b[2][2]=1,不然(1,2)就为1了。我们看(1,1)因为翻过一次,变成0,那么b[2][1]=0,不然(1,1)就变为1了。nm:确定b[][]举个栗子,a[][]数组如下,b[][]第一行枚举的。

Jaydenyu2012的博客 1148

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

棋盘游戏(HDU-1281)

Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子...

Alex_McAvoy的博客 1792

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

牛牛的跳跳棋

nowcoder 212985 牛牛的跳跳棋,贪心

欢迎您的光顾awa 8万+

2020牛客NOIP赛前训练营-普及组第一场牛牛的跳跳棋题解

链接:https://ac.nowcoder.com/acm/contest/7604/B 来源:牛客网 题目描述 牛牛最近在玩一种叫做跳跳棋的游戏,棋盘可以看成是一个一维的线性数组,编号从1到n+1。 一开始牛牛的棋子位于第1个格子,游戏的最终目的是将棋子移动到第n+1个格子。 棋盘1~n的每个格子都有一个“弹力系数”的权值pi。 当棋子位于第i个格子时,它的下一步可以移动到[i−pi,i+pi]范围内的任意一个格子。 举例来说,假设第3个格子的弹力系数为2,那么牛牛下一步可以移动到第1,2,

雨后qingtian的博客 1731

关于队列中使用pair的总结

今天在学到广度优先搜索时,学长给我们提到大部分广度优先搜索都会用到队列(queue),而在使用queue时有两种方法来给队列赋多个值,一个是自写结构体,另一个就是使用pair。 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair。就像STL中的map就是将key和value放在一起来保存。同样的,当一个函数需要返回2个数据的时候,可以选择pair。pair会将两个数据分别转换为first和second储存到pair定义的变量中。 拿广度优先搜索来举例,可以使用queue<pa

qq_74910785的博客 4941

题解 填充棋盘

too late

yours8的博客 497

2018美团CodeM编程大赛 初赛A轮 A 下棋(模拟)

[编程|1000分] 下棋时间限制:C/C++ 1秒,其他语言 2秒空间限制:C/C++ 262144K,其他语言 524288K64bit IO Format: %lld题目描述    有一个1*n的棋盘,上面有若干个棋子,一个格子上可能有多个棋子。    你每次操作是先选择一个棋子,然后选择以下两个操作中的一个:    (1) 若该棋子不在 (1,1),让这个棋子往左走一格,即从 (1,x) ...

Ever_glow的博客 1635

AI 辅助面试准备:基于 GPT-4 模拟 10 轮技术面试问答与反馈优化

本文详细介绍了如何利用GPT-4进行AI辅助面试准备,通过模拟10轮技术面试问答与反馈优化,帮助候选人提升表达清晰度和问题解决能力。文章涵盖构建高效面试环境、动态Prompt工程、结构化评估框架等实用技巧,特别适合技术岗位求职者系统化提升面试表现。

weixin_33859231的博客 594

POJ1195/BZOJ1176 题解,CDQ分治

POJ1195 MOBILE/ BZOJ 1176 这两个题题意完全相同,放在一起说吧 题意: 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1 将格子x,y里的数字加上A 2 x1 y1 x2 y2

qyfl806的博客 602

CodeM美团点评编程大赛初赛A轮 C.倒水【二分+分类讨论】

[编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升。另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升。 现在要把大水缸的水倒入n杯水中,使得n杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留4位小数。 注意:一杯温度为t1单位、体积为c1升的水与另一杯温度为t2单位

mengxiang000000 774

蓝桥杯--地宫取宝

标题:地宫取宝     X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。     地宫的入口在左上角,出口在右下角。     小明被带到地宫的入口,国王要求他只能向右或向下行走。     走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。     当小明走到出口时,如果他手中的

缥缈依梦云 4765

Problem 2285 迷宫寻宝 (BFS)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323Submit: 1247Time Limit: 1000 mSecMemory Limit : 32768 KB Problem Description 洪尼玛今天准备去寻宝,在一个n*n ...

weixin_30521649的博客 224
上一篇: leetcode 500. 键盘行 (很简单,就是要保存每一行的字母的值,写起来很繁琐)
下一篇: 2018 CodeM初赛A轮 .编程1 (A题) (第一道题)
Torch_Man
博客等级 码龄9年 6粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值