atcoder解题

#include <iostream>
#include <vector>using namespace std;int main() {long long N, M;cin >> N >> M;vector<long long> X(M), A(M);long long totalStones = 0;// 读入 X 和 Afor (int i = 0; i < M; i++) {cin >> X[i];}for (int i = 0; i < M; i++) {cin >> A[i];totalStones += A[i]; // 计算总石头数}// 如果总石头数不等于 N,输出 -1if (totalStones != N) {cout << -1 << endl;return 0;}long long moves = 0;  // 操作次数long long currentStones = 0; // 当前单元格的石头数量// 使用一个数组来表示每个位置的石头数量vector<long long> stones(N, 0);for (int i = 0; i < M; i++) {stones[X[i]] = A[i];}// 从左到右遍历for (int i = 0; i < N - 1; i++) {currentStones += stones[i]; // 当前单元格的石头数if (currentStones > 1) {moves += currentStones - 1; // 多余的石头移到下一个单元格currentStones = 1; // 当前单元格只剩 1 块石头} else if (currentStones < 1) {moves += 1 - currentStones; // 缺少的石头移动到当前单元格currentStones = 1; // 当前单元格补齐}}// 输出最少的移动次数cout << moves << endl;return 0;
}

 详细解释各段

vector<long long> X(M), A(M);
long long totalStones = 0;
  • X 数组存储每个含有石头的单元格的位置(从 0N−1)。
  • A 数组存储每个含有石头的单元格上有多少块石头。
  • totalStones 用来计算所有石头的总数。
// 从左到右遍历
for (int i = 0; i < N - 1; i++) {currentStones += stones[i]; // 当前单元格的石头数if (currentStones > 1) {moves += currentStones - 1; // 多余的石头移到下一个单元格currentStones = 1; // 当前单元格只剩 1 块石头} else if (currentStones < 1) {moves += 1 - currentStones; // 缺少的石头移动到当前单元格currentStones = 1; // 当前单元格补齐}
}

 

解释:
  1. 从左到右遍历:我们从左到右逐个遍历每个单元格(从 0N−1,但最后一个单元格 N−1 没有后续单元格可以接收石头,所以我们遍历到 N−2)。

  2. currentStones += stones[i]

    • currentStones 累加当前单元格 i 上的石头数量。
    • 这样 currentStones 记录的是从左侧到当前单元格的石头总数。
  3. 处理多余石头的情况

    • 如果 currentStones > 1,说明当前单元格的石头数量超过 1 块。为了让当前单元格恰好有 1 块石头,我们需要将多余的石头移动到右边的单元格。
    • 移动的石头数是 currentStones - 1,因此我们将移动次数 moves 增加 currentStones - 1
    • 然后将 currentStones 设置为 1,表示当前单元格的石头数量已经调整为 1
  4. 处理缺少石头的情况

    • 如果 currentStones < 1,说明当前单元格缺少石头。为了让当前单元格恰好有 1 块石头,我们需要从左边的单元格(或前面已经移动过来的石头)补充石头。
    • 需要移动的石头数是 1 - currentStones,所以我们将 moves 增加 1 - currentStones
    • 然后将 currentStones 设置为 1,表示当前单元格的石头数量已经补齐为 1

但是stones 数组分配了大小为 N 的数组,然而,题目给出的约束条件中 N 最大可以达到 2×10九次方,这意味着直接分配大小为 N 的数组可能会导致内存溢出,程序崩溃。

即使我们可以分配内存,处理的时间复杂度可能会非常高,尤其是当 N 非常大的时候。 

代码修改:

  1. 使用一个哈希映射(map)存储石头的位置信息,不再创建大小为 N 的数组。只需要存储那些含有石头的单元格的位置和对应的石头数量。
  2. 使用一个变量 currentStones 来跟踪当前单元格的石头数量,而不是遍历所有单元格。

修改后的代码如下:

 

#include <iostream>
#include <vector>
#include <map>using namespace std;int main() {long long N, M;cin >> N >> M;vector<long long> X(M), A(M);long long totalStones = 0;// 读入 X 和 Afor (int i = 0; i < M; i++) {cin >> X[i];}for (int i = 0; i < M; i++) {cin >> A[i];totalStones += A[i]; // 计算总石头数}// 如果总石头数不等于 N,输出 -1if (totalStones != N) {cout << -1 << endl;return 0;}long long moves = 0;  // 操作次数long long currentStones = 0; // 当前单元格的石头数量// 使用一个 map 来表示每个含有石头的单元格位置和石头数量map<long long, long long> stones;for (int i = 0; i < M; i++) {stones[X[i]] = A[i];}// 从左到右遍历for (long long i = 0; i < N - 1; i++) {// 如果当前单元格有石头if (stones.count(i) > 0) {currentStones += stones[i];  // 当前单元格的石头数}if (currentStones > 1) {moves += currentStones - 1;  // 多余的石头移到下一个单元格currentStones = 1;  // 当前单元格只剩 1 块石头} else if (currentStones < 1) {moves += 1 - currentStones;  // 缺少的石头移动到当前单元格currentStones = 1;  // 当前单元格补齐}}// 输出最少的移动次数cout << moves << endl;return 0;
}

主要改动

  1. 使用 map<long long, long long> stones:
    • 我们用 map 来存储每个含有石头的单元格的位置及其石头数量。这样就可以有效避免为所有单元格分配内存,只有 M 个含石头的单元格需要存储。
    • stones.count(i) 用来检查当前单元格 iii 是否有石头。如果有石头,就将该位置的石头数量加到 currentStones 中。
  2. 避免遍历所有单元格
    • 我们仍然从左到右遍历所有单元格(从 0N−2),但是不再维护一个大小为 N 的数组来表示每个单元格的石头数量,而是通过 map 来动态获取每个含石头单元格的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#-密封类、密封方法

一&#xff1a;密封类 关键字&#xff1a;sealed 密封类&#xff1a; sealed class Enemy{} 密封方法&#xff1a;密封方法必须是被重写的方法 public sealed override void Move(){...} 密封类不能被继承&#xff0c;密封方法不能被重写 → 让类无法再被继承 加强面向对象…

onnx-runner:使用ORT运行YOLO的ONNX模型

onnx-runner onnx-runner使用 ORT 运行 ONNX 模型&#xff0c;使用Rust构建。 目前仅支持 YOLO 模型&#xff0c;未来可能会支持其他 ONNX 模型 安装 要求 如果您想使用 CPU 运行 onnx-runner&#xff0c;则无需安装如果您想使用 GPU 运行 onnx-runner&#xff0c;则需要安…

Vue:侦听属性

Vue&#xff1a;侦听属性 watch深度侦听异步任务 watch 在Vue中&#xff0c;允许用户在数据改变时&#xff0c;做出一定的处理。 语法&#xff1a; new Vue({watch:{属性名:{handler(newValue, oldValue){// 函数体} }} })当一个属性被写入watch中&#xff0c;每当这个属性…

朴素贝叶斯分类器基于iris及Python手写实现

数据来源为sklean.datasets中的load_iris&#xff0c;代码如下&#xff1a; # -*- coding:utf-8 -*- import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import ac…

SwiftUI开发教程系列 - 第1章:简介与环境配置

1.1 SwiftUI简介 SwiftUI 是 Apple 于 2019 年推出的声明式用户界面框架&#xff0c;旨在简化 iOS、macOS、watchOS 和 tvOS 应用的 UI 开发。与 UIKit 的命令式编程方式不同&#xff0c;SwiftUI 提供了一种声明式语法&#xff0c;让开发者可以以更加直观、简洁的方式构建 UI。…

Flutter 中 Provider 的使用指南

目录 1.什么是 Provider 2.如何安装 Provider 3.基本使用方式 1.使用ChangeNotifierProvider提供状态 2.使用 Provider.of 手动读取状态 3.多Provider 的使用 4.常见的 Provider 类型 在 Flutter 开发中&#xff0c;状态管理是一个常见的需求。Provider 是 Flutter 官方…

《计算机原理与系统结构》学习系列——存储器(上)

系列文章目录 目录 存储器技术概要存储器层次cache&#xff0c;内存辅存存储器技术SRAM技术DRAM技术闪存磁盘存储器 局部性原理 高速缓存cache访存性能概念命中与缺失访存阻塞的周期数 cache基础&#xff1a;直接映射块号内存地址字段缺失缺失处理和写策略 全相联映射组相连映…

lua入门教程:type函数

在Lua中&#xff0c;type 函数是一个内置函数&#xff0c;用于返回给定值的类型。Lua 支持多种数据类型&#xff0c;包括 nil&#xff08;空值&#xff09;、boolean&#xff08;布尔值&#xff09;、number&#xff08;数字&#xff09;、string&#xff08;字符串&#xff09…

Centos 7离线安装ntpd服务

本文涉及一次Centos 7系统中离线安装ntpd对时服务的过程&#xff0c;其目的是为了在服务器运行过程中能够实时同步时间。 问题提出 某服务器需部署业务程序&#xff0c;这些程序的部署脚本是我初创的&#xff0c;后因其它事转交给其他人&#xff0c;后再因其它事又兜兜转转到了…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

A021基于Spring Boot的自习室管理和预约系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【GPT使用技巧】用AI出一门课

提问 我想做一个ChatGPT的课程&#xff0c;针对小白&#xff0c;解决从0到1的问题。按照小白的通点&#xff0c;列出大家最关心的问题&#xff0c;做一个课程大纲给我。避免生涩语言&#xff0c;用小白理解和关心的方式展示。 GPT的回答结果 课程大纲&#xff1a;ChatGPT入门…

【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽

目录 0 EasyExcel简介1 Excel导出工具类设置自定义表头样式设置自适应列宽添加合计行 2 调用导出工具类导出Excel表3 测试结果 0 EasyExcel简介 在数据处理和报表生成的过程中&#xff0c;Excel是一个非常常用的工具。特别是在Java开发中&#xff0c;EasyExcel库因其简单高效而…

2024年11月09号Drawing Memory Models Review 2

So lets start with a piece of code that well be thinking about and take a few seconds to read it carefully and try to explain, in your own words, what this piece of code does.

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (二)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 &#xff08;二&#xff09; 一、前言 目前鸿蒙应用的实现逻辑&#xff0c;基本都是参考和移植Android端来实现。针对BLE低功耗蓝牙来说&#xff0c;在鸿蒙化的实现过程中。我们发现了&#xff0c;鸿蒙独有的优秀点&#xff0c…

2024年【流动式起重机司机】模拟考试及流动式起重机司机证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 流动式起重机司机模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新流动式起重机司机证考试题目及答案&#xff01;多做几遍&#xff0c;其实通过流动式起重机司机模拟考试题很简单。 1、【多选题】( )和…

混合搜索与多重嵌入:一次有趣又毛茸茸的猫咪搜索之旅!(二)

这是继上一篇文章 “混合搜索与多重嵌入&#xff1a;一次有趣又毛茸茸的猫咪搜索之旅&#xff01;&#xff08;一&#xff09;” 的续篇。这这篇文章中&#xff0c;我们讲使用本地 Elasticsearch 部署来完成整个演示。这是一个简单的 Python Web 应用程序&#xff0c;展示了可…

【CSS】清除浮动(父元素塌陷)

在CSS布局中&#xff0c;“清除浮动”通常指的是消除由浮动元素引起的某些副作用&#xff0c;特别是当这些浮动元素影响到后续元素或者父元素的高度计算时。浮动元素会使它们脱离正常的文档流&#xff0c;这可能导致一些意料之外的效果&#xff0c;比如父元素高度塌陷&#xff…

算法【Java】—— 动态规划之路径问题

前言 本文章终点解析第一道题目【不同路径】和最后一道题目【地下城游戏】的动态规划思路&#xff0c;中间几道题目会很快过完&#xff0c;大家如果不熟悉动态规划的思路可以重点看一下这两道题目的解析。 不同路径 https://leetcode.cn/problems/unique-paths 解析&#xf…

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

本文目录索引 一个指令和三种方式通过约束脚本添加Golden位流工程MultiBoot位流工程验证example1总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我…