[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

相关文章

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

Python实现自动化删除Word文档超链接的实用技巧

《Python实现自动化删除Word文档超链接的实用技巧》在日常工作中,我们经常需要处理各种Word文档,本文将深入探讨如何利用Python,特别是借助一个功能强大的库,高效移除Word文档中的超链接... 目录为什么需要移除Word文档超链接准备工作:环境搭建与库安装核心实现:使用python移除超链接的