[Algorithm][综合训练][删除相邻数字的最大分数][分组][十字爆破]详细讲解

本文主要是介绍[Algorithm][综合训练][删除相邻数字的最大分数][分组][十字爆破]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.删除相邻数字的最大分数
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.分组
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 3.十字爆破
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.删除相邻数字的最大分数

1.题目链接

  • 删除相邻数字的最大分数

2.算法原理详解 && 代码实现

  • 自己的版本:贪心 --> 20% --> 自己知道这个策略必错 --> 而且数据范围没注意到
    #include <iostream>
    #include <queue>
    using namespace std;typedef pair<int, int> PII;struct Compare
    {bool operator()(PII p1, PII p2){return p1.first < p2.first;}
    };int main()
    {int n = 0;cin >> n;int x = 0;int hash[10] = { 0 };while(cin >> x){hash[x] += x;}priority_queue<PII, vector<PII>, Compare> heap;for(int i = 1; i < 10; i++){heap.push({hash[i], i});}int cnt = 0;while(heap.size()){auto [total, x] = heap.top();heap.pop();if(hash[x]){cnt += total;hash[x - 1] = 0, hash[x + 1] = 0;}}cout << cnt << endl;return 0;
    }
    
  • 优化版本:动态规划 – 线性dp
    • 状态表示
      • f[i]:选到i位置时,i位置必选,此时的最大分数
      • g[i]:选到i位置时,i位置不选,此时的最大分数
    • 状态转移方程
      • f[i] = hash[i] + g[i - 1]
      • g[i] = max(f[i - 1], g[i - 1]
    #include <iostream>
    using namespace std;const int N = 1e4 + 1;int main()
    {int n = 0;cin >> n;int x = 0;int hash[N] = { 0 };while(cin >> x){hash[x] += x;}int f[N] = { 0 };int g[N] = { 0 };for(int i = 1; i < N; i++){f[i] = g[i - 1] + hash[i];g[i] = max(f[i - 1], g[i - 1]);}cout << max(f[N - 1], g[N - 1]);return 0;
    }
    

2.分组

1.题目链接

  • 分组

2.算法原理详解 && 代码实现

  • 自己的策略:拿着人数,去分组 --> 几乎不可行的策略,指数级的时间复杂度
  • 优化版本:枚举 + 二分 --> 枚举最终的分配结果中,最多的人数
    #include <iostream>
    #include <unordered_map>
    using namespace std;int n = 0, m = 0;
    unordered_map<int, int> cnt;// 判断人数最多为x时,能否分成m组
    bool Check(int x)
    {int g = 0;for(auto& [a, b] : cnt){g += b / x + (b % x == 0 ? 0 : 1);}return g <= m;
    }int main()
    {cin >> n >> m;int x = 0, hMax = 0;for(int i = 0; i < n; i++){cin >> x;hMax = max(hMax, ++cnt[x]);}if(cnt.size() > m) // 边界情况处理{cout << -1 << endl;}else{int l = 1, r = hMax;while(l < r){int mid = (l + r) / 2;if(Check(mid)){r = mid;}else{l = mid + 1;}}cout << l << endl;}return 0;
    }
    

3.十字爆破

1.题目链接

  • 十字爆破

2.算法原理详解 && 代码实现

  • 自己的版本:暴力模拟 --> 超时 50%
    #include <iostream>
    #include <vector>
    using namespace std;int n = 0, m = 0;
    vector<vector<int>> nums;long long GetSum(int x, int y)
    {long long ret = 0;for(int i = 0; i < m; i++){ret += nums[x][i];}for(int i = 0; i < n; i++){ret += nums[i][y];}return ret - nums[x][y];
    }int main()
    {cin >> n >> m;nums.resize(n, vector<int>(m, 0));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d", &nums[i][j]);}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){printf("%lld ", GetSum(i, j));}printf("\n");}return 0;
    }
    
  • 优化版本:预处理 --> 先把每一行以及每一列的和存起来,再去直接拿现成的值
    #include <iostream>
    #include <vector>
    using namespace std;int main()
    {int n = 0, m = 0;scanf("%d %d", &n, &m);vector<vector<int>> nums(n, vector<int>(m, 0));vector<long long> row(n, 0), col(m, 0);for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d", &nums[i][j]);row[i] += nums[i][j];col[j] += nums[i][j];}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){printf("%lld ", row[i] + col[j] - nums[i][j]);}printf("\n");}return 0;
    }
    

这篇关于[Algorithm][综合训练][删除相邻数字的最大分数][分组][十字爆破]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104573

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.