C++每日一练:详解-买铅笔影分身三而竭

news2024/11/20 17:39:22

文章目录

  • 前言
  • 一、买铅笔
  • 二、影分身
  • 三、三而竭
  • 总结


前言

这回又换成C++了,Python要用C++也要用,没有哪个正经程序员只会一门语言的,咱可是CSDN认证带V的全栈攻城狮。今天的题目除了买铅笔都还是有点难度的,虽然影分身主要是考验阅读理解能力。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、买铅笔

题目描述
P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过 n 支铅笔才够给小朋 友们发礼物。 现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。

输入描述:
第一行包含一个正整数 n ,表示需要的铅笔数量。 接下来三行,每行用 2 个正整数描述一种包装的铅笔:其中第 1 个整数表示这种 包装内铅笔的数量,第 2 个整数表示这种包装的价格。 保证所有的 7 个数都是不超过 10000 的正整数。

输出描述:
1 个整数,表示P老师最少需要花费的钱。

示例:输入n=57, {{2, 2}, {50, 30}, {30, 27}} 输出:54

代码如下(示例):

using namespace std;
string solution(int n, int arr[3][2]){
    string result;
    // TODO:
    int minpay = 100000;
    for (size_t i=0; i<3; ++i){
        int tmp = arr[i][0];
        while (tmp<n){
            tmp += arr[i][0];
        }
        if ((tmp/arr[i][0])*arr[i][1] < minpay) minpay=(tmp/arr[i][0])*arr[i][1];
        result = to_string(minpay);
    }
    return result;
}

笔者做的题全是在原有代码的基础上改的,虽然为这点被坑了好多回,可就是不肯改。所以这里只给出solution函数就行了。

这题还是很简单的,代码中tmp是在不拆包装的情况下会买到的铅笔数,这里用的加法,其实也可以写成乘法的。乘法要判断是否整除的情况,可以用n/arr[i][0]+bool(n%arr[i][0]),运行速度应该差距不大。代码中的minpay用来表示最少地花费,比较一下取最小值就行。 需要注意的是minpay的初始值取大点,用题目所述的10000是不行的,好像只能得40分,费了我好几分钟才想到这值取小了…

二、影分身

题目描述
已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。 xyyx - > yx ->

输入描述:
输入多个字符。(1<=len<=1e5)

输出描述:
输出最后的分身

示例:输入:xyyyy 输出:yyy

代码如下(示例):
这是利用了stack栈的后入先出(LIFO)的特性来做的写法,这个办法是能满分的。具体的思路就是将要保留的字符压入栈中,再和后一个对比,如示例xyyyy:
首先,定义了输入栈out,循环i=0时,因为栈是空的,就将x压入,continue继续下一个循环。i=1循环时,out的top是x、str[i] 是y,所以栈中的x被弹出,下一个循环栈又是空的了,i=2 的y被压入,以此类摔倒…直到循环完成就得到了解,因为栈的特性,只能从顶端取出数据,所以写了一个while循环,把栈中的字符又重新组合成字符串。栈的速度是极快的,比数组都要快,而且非常简单易用!用得上的函数方法就pop、push、size、top,有一点要注意的是,它和Python的list的pop方法不一样,j=out.pop(),是取不到值的。这个方法返回的是void, top()才返回栈顶的引用。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>

using namespace std;

std::string solution(std::string str){
    std::string result;
    // TODO:
    stack<char> out;
    int l = str.length();
    for (int i=0; i<l; ++i){
        if (out.size()==0){
            out.push(str[i]);
            continue;
        }
        if (str[i] == out.top()){
            out.push(str[i]);
        }else{
            out.pop();
        }
    }
    while (out.size()){
        char j = out.top();
        result = j + result;
        out.pop();
    }
    return result;
}

这题看了好久又多次测试才明白题意,它是每次消除以后要从新开始从左到右再计算的,不是第一次计算后保留下来的就一定会保留,还要再次和后面的字母比较,所以最终的结果只会有x或y。理解这一点后,就相对比较简单了,一开始笔者写了个递归来做,测试用例是没问题的。但实际执行会提示:terminate called after throwing an instance of 'std::bad_alloc'内存分配不足了!果然递归不靠谱。这里也给出递归写法以供参考:

string reduce(string str){
    int l = str.length();
    if (l==0 || l==1){
        return str;
    } 
    for (int i=0; i<l; ++i){
        if(str[i]==str[i+1] && i+1==l-1){
            return str;
        } 
         else if(str[i]!=str[i+1] && i+1<l){
            str=str.substr(0,i)+str.substr(i+2,l);
            break;
        } 
    }
    return reduce(str);
}

这个写法相对前面的代码显得很简洁,思路也简单,退出递归的条件是三个:一是消完了,二是只剩下一个字符,三是全部字符都一样。后面就是每次递归消除二个字符。测试发现不能过关,才改成stack栈的写法,说明测试用例中有极长的字符串。

三、三而竭

这题之前做过了,难度系数在笔者看来还是有点高的,当时也费了不少时间才解出来,主要是容易超时。是一个凑数字的题,暴力凑的方法,其中几个数的取值范围很重要。笔者也没有想出其它更好的办法,按这个解法用了600多ms的时间,算是免费过关。请见:

https://blog.csdn.net/alal001/article/details/130119027


总结

希望本文能对各位看官有所启发,原创文章,未经许可,请勿转载。

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

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

相关文章

【matlab报错】:函数或变量 ‘randint‘ 无法识别。

问题产生 首先定位问题&#xff0c;这个问题是由matlab版本造成的&#xff0c;随着matlab版本的更新&#xff0c;matlab删除了 randint 这个函数。 怎么替代呢&#xff1f;鼠标悬浮在报错代码上面&#xff0c;如下&#xff1a; matlab提示我们对代码进行相应更改后改用randi了…

基于SSM+JSP校园二手交易系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

5年测试经验华为社招:半月3次面试,成功拿到Offer

背景经历 当时我工作近5年&#xff0c;明显感觉到了瓶颈期。具体来说&#xff0c;感觉自己用过很多测试框架和测试工具、做过一些测试开发、也有过高并发的性能测试&#xff0c;但是从技术深度上感觉不足&#xff0c;到后期时做事也没有明显挑战&#xff0c;完全适应了公司节奏…

新的网络钓鱼即服务平台让网络犯罪分子生成令人信服的网络钓鱼页面

至少从2022年中期开始&#xff0c;网络犯罪分子就利用一个名为“伟大”的新型网络钓鱼即服务(PhaaS或PaaS)平台来攻击微软365云服务的企业用户&#xff0c;有效地降低了网络钓鱼攻击的门槛。 思科Talos研究员蒂亚戈佩雷拉表示:“目前&#xff0c;Greatness只专注于微软365钓鱼…

[Hadoop]大数据导论与Linux基础

目录 大数据导论 企业数据分析方向 数据分析基本步骤 大数据时代 分布式与集群 Linux操作系统概述 操作系统概念与分类 Linux起源与发展 Linux内核与发行版本 VMware Workstation虚拟机使用 VMware虚拟机概念 VMware虚拟机常规使用 Linux常用基础命令 Linux文件系…

Spring Boot单元测试

什么是单元测试&#xff1f; 单元测试(unit testing)&#xff0c;是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。 单元测试是开发人员编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某…

Java面试知识点(全)- Java并发- Java并发基础一

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 多线程解决什么问题 CPU、内存、I/O 设备的速度是有极大差异的&#xff0c;为了合理利用 CPU 的高性能&#xff0c;平衡这三者的速度差异&#xff0c…

PMP课堂模拟题目及解析(第11期)

101. 一家咨询公司的负责人启动一个项目来扩大公司提供的服务数量&#xff0c;这公司具有竞争优势、出色的企业知识以及卓越的声誉&#xff0c;高管团队担心与增加新服务相关的负面业务结果的可能性。若要评估负面业务结果的可能性和影响&#xff0c;项目经理应该使用什么&…

matlab写入txt文件进行自动化测试总结:fopen、fclose和fprintf的用法

前言 日常学习的过程中使用了matlab读写txt文件&#xff0c;记录一下基本函数的使用&#xff0c;本文主要介绍了fopen、fclose和fprintf几个函数&#xff0c;这些主要是面向txt格式的文件保存数据。还有其他几个函数&#xff0c;比如fread和fwrite&#xff0c;用过但是他们是针…

【dcdc】AP2813 DCDC降压恒流芯片 两路输出 一路恒流 一路瀑闪 电动摩托汽车灯方案

1&#xff0c;方案来源&#xff1a;深圳市世微半导体有限公司 汤巧 2&#xff0c;产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达12W&#xff0c;最大电流…

图神经网络+强化学习

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 车辆路径规划问题&#xff08;VRP&#xff09;是运筹优化领域最经典的优化问题之一。在此问题中&#xff0c;有若干个客户对某种货物有一定量的需求&#xff0c;车辆可以从仓库取货之后配送到客户手中。客户点与仓库点组成了一…

DSP_TMS320F28377D_一键烧写多核程序

以前在开发和调试TMS320F28377D的双核程序的时候&#xff0c;总是在烧写CPU1程序时&#xff0c;自动把CPU2的程序也烧写了&#xff0c;但往CPU2里面烧写的是CPU1的程序&#xff0c;烧写完进入在线仿真模式的时候&#xff0c;还需要手动重新选择CPU2要烧写的程序&#xff0c;重新…

谈谈Netty线程模型

大家好&#xff0c;我是易安&#xff01; Netty是一个高性能网络应用框架&#xff0c;应用非常普遍&#xff0c;目前在Java领域里&#xff0c;Netty基本上成为网络程序的标配了。Netty框架功能丰富&#xff0c;也非常复杂&#xff0c;今天我们主要分析Netty框架中的线程模型&am…

【数据分享】2014-2023年全国监测站点的逐年空气质量数据(15个指标\shp\excel格式)

空气质量的好坏反映了空气的污染程度&#xff0c;在各项涉及城市环境的研究中&#xff0c;空气质量都是一个十分重要的指标。空气质量是依据空气中污染物浓度的高低来判断的。 我们发现学者王晓磊在自己的主页里面分享了2014年5月以来的全国范围的到站点的逐时空气质量数据&am…

网络安全--红队资源大合集

红队攻击的生命周期&#xff0c;整个生命周期包括&#xff1a; 信息收集、攻击尝试获得权限、持久性控制、权限提升、网络信息收集、横向移动、数据分析&#xff08;在这个基础上再做持久化控制&#xff09;、在所有攻击结束之后清理并退出战场。 重点提醒&#xff1a;本项目…

JVM内存区域(一)

运行时数据区域 ** 线程私有的&#xff1a; 程序计数器虚拟机栈本地方法栈线程共享的&#xff1a; 线程共享的&#xff1a; 堆方法区直接内存 (非运行时数据区的一部分) 程序计数器 程序计数器是一块较小的内存空间&#xff0c;可以看作是当前线程所执行的字节码的行号指示…

15-02 身份安全

身份安全——认证 目录管理系统 身份认证 你知道什么&#xff1a;密码、PIN、密码短语你拥有什么&#xff1a;硬令牌、智能卡、USB卡、手机APP指纹、声纹、脸纹、虹膜 授权和访问控制 访问控制 访问控制原则 最小特权&#xff1a;安全管理员禁止访问任何资源默认拒绝&…

【005】C++数据类型之实型(浮点数)、有符号数以及无符号数

C数据类型之实型、有符号数以及无符号数 引言一、实型&#xff08;浮点数&#xff09;1.1、实型常量1.2、实型变量 二、有符号数三、无符号数总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有…

Eolink 出席 QECon 深圳站,共同探讨软件质量和效能发展

5月12日至13日&#xff0c;由 QECon 组委会和深圳市软件行业协会联合主办的「QECon全球软件质量&效能大会」成功召开&#xff0c;作为国内 API 全生命周期解决方案的领军者&#xff0c;Eolink 受邀参加此次大会。 大会中&#xff0c;Eolink SaaS 产品负责人崔嘉杰、高级售…

《思考致富》不应该指望不经历“暂时的失败”便能发财

目录 作者简介 经典摘录 机遇有个狡猾的习惯&#xff0c;喜欢从后门悄悄溜进来&#xff0c;往往还喜欢以灾难或暂时失败的方式乔装露面 离金矿仅有三英尺远 欲望&#xff1a;成就一切的起点&#xff08;通往致富之路的第一步&#xff09; 信念&#xff1a;在脑海里目睹并坚…