【刷题汇总 -- 压缩字符串(一)、chika和蜜柑、 01背包】

news2024/11/26 4:35:30

C++日常刷题积累

  • 今日刷题汇总 - day018
    • 1、压缩字符串(一)
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现
    • 2、chika和蜜柑
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现
    • 3、 01背包
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 -- dp
    • 4、题目链接

今日刷题汇总 - day018

1、压缩字符串(一)

1.1、题目

在这里插入图片描述

1.2、思路

读完题,知道让处理一组英文字符串,完成压缩功能,压缩规则满足保持字符串的顺序将多余相邻的字符压缩以数字字符表示当前被压缩的字母个数,其中注意如果只有一个字符,1不用写。通过分析示例和题目规则,想到蛮力法,遍历字符串利用一个新字符串retstr接收遇到的字母进行尾插,统计相邻字母的个数到count中,然后转字符串尾插在字母后,然后处理重复的字母直接++count次不作任何处理知道遇见下一个不同字母即可,然后count小于1也不用管,直到遍历结束即可。接下来,就是程序实现。

1.3、程序实现

按照思路分析,完成程序即可。主要在于处理一些细节如边界控制,相同的直接统计个数和让遍历的下标++,然后处理大于1的个数尾插使用to_string(count),另外需要重置计数器为1,才进入下次循环。

class Solution {  
public:  
    string compressString(string param) {  
        string retstr;  
        int count = 1;  
        for (int i = 0; i < param.size(); i++)
        {  
            while (i + 1 < param.size() && param[i + 1] == param[i])
            {  
                count++;  
                i++;  
            }  
            retstr += param[i];  
            if (count > 1) 
            {   
                retstr += to_string(count);                  
            }  
            count = 1; // 重置计数器  
        }  
        return retstr;  
    }  
};

在这里插入图片描述
在这里插入图片描述

2、chika和蜜柑

2.1、题目

在这里插入图片描述

2.2、思路

读完题,想到跟上次比那名居的桃子类似,但是这里并没有限制持续时间等条件,这里是任意挑选k不使用滑动窗口,所以利用排序的思想,将每个橘⼦按照甜度由⾼到低排序,相同甜度的橘⼦按照酸度由低到⾼排序。满足尽可能地甜度高。然后提取排序后的前k个橘⼦就得到最好地选择方案了。那么接下来,就是程序实现。

2.3、程序实现

首先,按照题目要求完成输入n,k代表蜜柑总数和chika吃的蜜柑数量,然后这里为了方便描述甜度和酸度这里使用pair,然后就可以输入数组arr中即可。

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 2e5 + 10;
typedef pair<int, int> PII; // <酸度,甜度> 
PII arr[N];

int main()
{
    int n, k;
    cin >> n >> k;
    for(int i = 0; i < n; i++) 
        cin >> arr[i].first;
    for(int i = 0; i < n; i++) 
        cin >> arr[i].second;

    //sort
    
    //求前k个蜜柑甜度和酸度和
    
    return 0;
}

接下来就是排序地思路,需要满足题目中尽可能地甜和不酸,那么这里可以采用lambda表达式与sort结合的方式处理即可。lambda实际上可以理解为仿函数,使其sort的执行逻辑更加方便了。

[&] 表示捕获列表,这里使用 & 表示捕获外部作用域中所有变量的引用。但在这个 lambda 表达式中,实际并没有使用到外部变量,所以 [](不捕获任何变量)或 [&] 都是可以的。
(const PII& a, const PII& b) 是 lambda 表达式的参数列表,表示这个函数对象接受两个 PII 类型的常量引用作为参数。
函数体 {} 中定义了比较逻辑:首先比较两个元素的甜度(a.second 和 b.second),如果甜度不同,则甜度较大的元素被认为更大(这里使用了 >,意味着排序后甜度是降序的)。如果甜度相同,则比较酸度,酸度较小的元素被认为更大(这里使用了 <,但注意这是为了保持甜度相同时的稳定性,实际上排序的主要依据是甜度)。

sort(arr, arr + n, [&](const PII& a, const PII& b){
         if(a.second != b.second) 
             return a.second > b.second;
         else 
             return a.first < b.first;
        }
    );

否则,不然就自己单独再封装一个比较逻辑的函数,回调到sort也行,一样的,所以综合考虑lambda这里会更好。也是处理类似逻辑比较常用的方法之一。

// 自定义比较函数  
bool compare(const PII& a, const PII& b) {  
    if (a.second != b.second) {  
        return a.second > b.second; // 甜度降序  
    } else {  
        return a.first < b.first; // 甜度相同时,酸度升序  
    }  
}  

// 使用自定义比较函数进行排序  
sort(arr, arr + n, compare);

除此之外,对于自定义封装的函数又恰好是比较元组类型的值,可以使用tie的逻辑实现,但是要清楚比较对象之间的关系。

注意包含头文件#include < tuple > // 对于 std::tie

// 自定义比较函数  
bool compare(const PII& a, const PII& b) {  
    return tie(b.second, a.first) < tie(a.second, b.first);  
    // 注意这里的 b.second 和 a.first 是为了得到甜度降序,酸度相同则酸度升序的效果  
    // 但实际上,对于这种情况,更直观的方式直接比较定义,更具有阅读性 
}  
// 使用自定义比较函数进行排序  
sort(arr, arr + n, compare);

最后,遍历前k个蜜柑获取甜度和酸度和,然后按照题目要求的格式输出即可。

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 2e5 + 10;
typedef pair<int, int> PII; // <酸度,甜度> 
PII arr[N];

int main()
{
    int n, k;
    cin >> n >> k;
    for(int i = 0; i < n; i++) 
        cin >> arr[i].first;
    for(int i = 0; i < n; i++) 
        cin >> arr[i].second;

    sort(arr, arr + n, [&](const PII& a, const PII& b){
         if(a.second != b.second) 
             return a.second > b.second;
         else 
             return a.first < b.first;
        }
    );

    long long s = 0, t = 0;
    for(int i = 0; i < k; i++)
    {
        s += arr[i].first;
        t += arr[i].second;
    }
    cout << s << " " << t << endl;
    return 0;
}

在这里插入图片描述
在这里插入图片描述

3、 01背包

0/1背包详解参考

3.1、题目

在这里插入图片描述

3.2、思路

读完题知道,0/1背包问题是算法课的经典题型了,通常涉及贪心和dp动态规划法,简单说就是尽可能让包不超重情况下,装最多的物品。所以这里分析题目和示例得知,采用动态规划法分析:状态表示和状态转移方程。
状态表示:dp[i][j]:表示从前 i 个物品中挑选,总体积不超过 j 的情况下,最⼤重量是多少。
推导状态转移方程,根据「最后⼀步」的状况,需要分情况讨论:
(1)、当第i个物品不被选时,就是i-1个物品中挑选,且体积不超过j,此时满足dp[i][j] = d[i-1][j];
(2)、当选择第i 个物品时,那么就只能去前i - 1 个物品中,挑选总体积不超过j - v[i]的物品。此时dp[i][j] = dp[i - 1][j - v[i]] + w[i] 。但是这种状态不⼀定存在,因此需要特判⼀下。
综上所述:
状态转移⽅程为: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i])
那么接下来,就是程序实现。

3.3、程序实现 – dp

首先,题目已经给了几个参数:

int V 表示背包的最大容量。
int n 表示物品的数量。
vector<vector >& vw 是一个二维向量,其中vw[i][0]表示第i个物品的重量,vw[i][1]表示第i个物品的价值。

然后按照思路分析的需求定义dp数组,然后,在内层循环中依次放入物品,对于每个容量j,如果当前容量j大于等于当前物品的重量vw[i][0],则有两种选择:
1.不装入当前物品,此时背包的价值为dp[j](即前i-1个物品在容量j下的最大价值)。
2.装入当前物品,此时背包的价值为dp[j - vw[i][0]] + vw[i][1](即前i-1个物品在容量j - vw[i][0]下的最大价值,加上当前物品的价值)。
使用max函数比较这两种选择,取较大值作为dp[j]的值,即dp[j] = max(dp[j], dp[j - vw[i][0]] + vw[i][1]);。
最终,dp[V]存储的就是在背包容量为V时,能够装载的最大价值,将其作为函数的返回值。

class Solution {
  public:
    int dp[1010] = { 0 };

    int knapsack(int V, int n, vector<vector<int> >& vw) {
        for (int i = 0; i < n; i++)
        {
            for (int j = V; j >= vw[i][0]; j--)
            {
                dp[j] = max(dp[j], dp[j - vw[i][0]] + vw[i][1]);
            }
        }
        return dp[V];
    }
};

在这里插入图片描述
在这里插入图片描述

4、题目链接

🌟压缩字符串(一)
🌟chika和蜜柑
🌟01背包

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

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

相关文章

宠物空气净化器哪款除臭效果好?质量好的养狗空气净化器排名

作为一个宠物家电小博主&#xff0c;炎炎夏日&#xff0c;家中的宠物给你带来的不仅仅是温暖的陪伴&#xff0c;还有那挥之不去的宠物异味。普通空气净化器虽然能够应对一般的空气净化需求&#xff0c;但对于养猫家庭特有的挑战&#xff0c;如宠物毛发、皮屑和异味等&#xff0…

模版初阶与STL

1.泛型编程 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left, char& right) {char temp left;left r…

Linux系统安装的详细步骤详解

在VM虚拟机上安装Linux系统全过程&#xff0c;闭眼跟着走就行&#xff01;&#xff01;&#xff01; 1、准备好VMware Worestation虚拟机软件和Linux系统的映像文件 2、点击创建新的虚拟机 3、在新建虚拟机向导中&#xff0c;选择典型安装模式。典型安装模式可以通过几个简单的…

简析漏洞生命周期管理的价值与关键要求

开展全面且持续的漏洞管理工作&#xff0c;对于企业组织改善数字化应用安全状况&#xff0c;降低潜在风险&#xff0c;并保持数字资产的完整性和可信度至关重要。做好漏洞管理并不容易&#xff0c;组织不仅需要拥有健全的漏洞管理策略&#xff0c;同时还要辅以明确定义的漏洞管…

VulnHub:tenderfoot1

靶机下载地址 信息收集 主机发现 扫描攻击机同网段存活主机。nmap 192.168.31.0/24 -Pn -T4 目标主机ip&#xff1a;192.168.31.199。 端口扫描 nmap 192.168.31.199 -A -p- -T4 开放了22,80端口&#xff0c;即ssh和http服务。 目录扫描 访问http服务&#xff0c;是apac…

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

WebGIS的Web服务概述

WebGIS是互联网技术应用于GIS开发的产物&#xff0c;是现代GIS技术的重要组成部分&#xff0c;其中的Web服务是现代WebGIS的核心技术和重要标志&#xff0c;它集GIS、程序组件和互联网的优点于一身&#xff0c;深刻改变了GIS开发和应用的方式&#xff0c;绕过了本地数据转换和本…

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…

完美解决Ubuntu的MySQL临时文件夹修改调整

打开终端,输入以下命令$ sudo -i # 切换root用户 $ systemctl stop mysql.service $ mkdir /home/tmp $ chown root:root /home/tmp $ chmod 1777 /home/tmp $ gedit /etc/mysql/mysql.conf.d/mysqld.cnf以上最后一条命令执行完后,在打开的mysqld.cnf文件做如下修改并保存关闭…

栈和队列(C语言)

栈的定义 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

【Python正则表达式】:文本解析与模式匹配

文章目录 1.正则表达式2. re模块3.修饰符3.元字符3-1 字符匹配元字符3-2 重复次数限定元字符3-3 字符集合匹配元字符3-4 分组元字符3-5 边界匹配元字符3-6 字符类别匹配元字符 4.技巧4-1 贪婪与非贪婪 5.案例 1.正则表达式 正则表达式面向什么样的问题&#xff1f; 1、判断一个…

平衡三进制计算机模拟2

1、计算机的起源 在19世纪的时候&#xff0c;“Computer”代表的并不是计算机&#xff0c;而是计算员&#xff0c;那时并没有计算机的概念&#xff0c;而计算员当然是要计算东西的&#xff0c;当时计算东西多&#xff0c;计算水平也参差不齐&#xff0c;加上疲劳等因素&#xf…

华夏银行的进和退:不良率位列同业第一,分红比例常年不达标

撰稿|芋圆 来源|贝多财经 近日&#xff0c;华夏银行股份有限公司&#xff08;SH:600015&#xff0c;下称“华夏银行”&#xff09;北京分行联合北京产权交易所举办了特殊资产推介会。会上&#xff0c;华夏银行包括北京分行在内的7家分行和信用卡中心&#xff0c;共同推介了超…

从操作系统层面认识Linux

描述进程-PCB Linux操作系统下的PCB是: task_struct https://www.cnblogs.com/tongyan2/p/5544887.htmlhttps://www.cnblogs.com/tongyan2/p/5544887.html校招必背操作系统面试题-什么是 PCB&#xff08;进程控制块&#xff09; &#xff1f;_哔哩哔哩_bilibili校招必背操作系…

汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

汉明权重&#xff08;Hamming Weight&#xff09;&#xff08;统计数据中1的个数&#xff09;VP-SWAR算法 定义 汉明重量是一串符号中非零符号的个数。它等于同样长度的全零符号串的汉明距离(在信息论中&#xff0c;两个等长字符串之间的汉明距离等于两个字符串对应位置的不同…

浏览器插件利器--allWebPluginV2.0.0.16-beta版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

刷题了:242.有效的字母异位词 |349. 两个数组的交集 | 202. 快乐数|1. 两数之和

学习记录&#xff0c;主要参考&#xff1a;代码随想录 哈希表理论基础 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 哈希表&#xff08;Hash table&#xff09; 哈希表是根据关键码的值而直接进行访问的数据…

deepseek-vl 论文阅读笔记

目录 一、已有模型性能差距分析 二、创新点 数据集构建 模型架构 训练策略 实验与评估 三、细节 数据构建 内部SFT数据的分类体系 模型架构 训练流程包括三个阶段 系统包含三个模块 混合视觉编码器 视觉-语言适配器 语言模型 训练策略 阶段一&#xff1a;训练…

nfs和web服务器的搭建

&#xff08;一&#xff09;web服务器的搭建 1.配置基本环境 要点有&#xff0c;yum源&#xff0c;包含nginx和阿里云&#xff08;或者腾讯云或者华为云&#xff09;&#xff0c;这里的相关知识可以参考之前的yum配置笔记 2.安装nginx yum -y install nginx 3.验证并且开启服…