[Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解

本文主要是介绍[Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.消减整数
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.最长上升子序列(二)
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 3.春游
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.消减整数

1.题目链接

  • 消减整数

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

  • 解法:贪心 + 数学
    • 每次尽可能的减去之前数的两倍,并且能保证可以减到0
    • x % 2a == 0
    #include <iostream>
    using namespace std;int Check(int h)
    {int ret = 0, a = 1;while(h){ret++;h -= a;if(h % (2 * a) == 0){a *= 2;}}return ret;
    }int main()
    {int n = 0, h = 0;cin >> n;while(n--){cin >> h;cout << Check(h) << endl;}
    }
    

2.最长上升子序列(二)

1.题目链接

  • 最长上升子序列(二)

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

  • 自己的版本:动态规划 -> 50%
    int LIS(vector<int>& nums) 
    {int n = nums.size();vector<int> dp(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i]){dp[i] = max(dp[i], dp[j] + 1);}}ret = max(ret, dp[i]);}return ret;
    }
    
  • 优化版本:贪心 + 二分
    • 不关心前面的非递减子序列长什么样子,仅需知道长度为x的子序列末尾是多少即可
    • 存长度为x的所有子序列的末尾时,只用存最小的那个数即可
    • 优化:二分快速寻找插入位置
    int LIS(vector<int>& a)
    {int pos = 0;vector<int> dp(a.size() + 1, 0); // dp[i]: 长度为i的最小末尾// 查找x应该放在哪个位置for(const auto& x : a){// 边界情况处理if(pos == 0 || x > dp[pos]){dp[++pos] = x;}else{// 二分查找插入位置int l = 1, r = pos;while(l < r){int mid = (l + r) / 2;if(dp[mid] >= x){r = mid;}else{l = mid + 1;}}dp[l] = x;}}return pos;
    }
    

3.春游

1.题目链接

  • 春游

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

  • 解法:贪心 + 分类讨论 --> 细致讨论即可,容易疏漏
    请添加图片描述

    #include <iostream>
    using namespace std;long long n = 0, a = 0, b = 0;long long CostTotal(char ch)
    {long long sum = 0;if(ch == 'a'){sum = n / 2 * a;n %= 2;if(n){sum += min(min(a, b), b - a);}}else{sum = n / 3 * b;n %= 3;if(n == 1){sum += min(min(a, b), 2 * a - b);}else if(n == 2){sum += min(min(a, b), 3 * a - b);}}return sum;
    }int main()
    {int t = 0;cin >> t;while(t--){cin >> n >> a >> b;float av = a / 2.0, bv = b / 3.0;if(n <= 2){cout << min(a, b) << endl;continue;}if(av < bv){cout << CostTotal('a') << endl;}else{cout << CostTotal('b') << endl;}}return 0;
    }
    

这篇关于[Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的