蓝桥杯刷题-入门题(终章一)

news2024/11/18 3:34:50

你是如风的少年~😃

空 清新民谣版 - 汪小敏 - 单曲 - 网易云音乐

自在的少年 - 要不要买菜 - 单曲 - 网易云音乐

最后15道入门题,做完这15道,NEWOJ就91道题AC了

目录

一,数根

二,最大值和最小值(I)

三,打印直角三角形

四,最大值和最小值(II)

五,消消乐(一题多解)

字符串操作函数 

代码1  s.substr(i, j)

代码2  s.erase(i , j) 

代码3   栈

六,按纯度筛选(超限!!)

七,加密数(溢出!!)

总结 


一,数根

P1062 - 数根 - New Online Judge (ecustacm.cn)

 

卡了好久...思路真的很简单,20行代码的事

1,按字符串输入,转整型

2,整型不用转回字符串再转整型了(麻烦,而且不好实现)(这步想复杂了...)

     类似十进制转八进制那样,直接取每一位相加,如果依旧>= 10(即 / 10 != 0),重复这一步

 3,注意,构造函数中的return需要赋值给一个变量,而cout才能直接输出

#include<iostream>
using namespace std;
int number(int x)
{
    int y = 0;
    while(x) { //注意是x!= 0
        y += x % 10;
        x /= 10;
    }
    if(y / 10 == 0) cout<<y; //注意是y / 10 == 0
    else return number(y);
}
int main()
{
    int a = 0;
    string s;
    cin>>s;
    for(int i = 0; i < s.size(); ++i)
        a += s[i] - '0';
    number(a);
    return 0;
}
24
6

6666
6

9127812749871298471928748124781278471827489214
7

二,最大值和最小值(I)

P1063 - 最大值和最小值(I) - New Online Judge (ecustacm.cn)

 

输入a[n],对a[n]排序得到b[n],b[0]和b[n - 1]即最小值和最大值再通过遍历将 i 赋值给数组,c[a[i]] = i得到元素对应的下标需要注意的是,遍历到最大值b[n - 1]即可)然后c[b[0]] - c[b[n - 1]]相减取abs

 第一次提交,Ac 90%,因为没考虑比如1 1 1 1的情况,按原代码会输出-1,需要加个max(0, ...)

通过代码

#include<iostream>
#include<cmath> //abs
#include<algorithm> //sort()
using namespace std;
int a[10010], b[10010], c[10010];;
int main()
{
    int ans, n;
    cin>>n;
    for(int i = 0; i < n; ++i) {
        cin>>a[i];
        b[i] = a[i];
    }
    sort(b, b + n); //从小到大
    for(int i = 0; i <= b[n - 1]; ++i) c[a[i]] = i;//元素对应下标
    ans = abs(c[b[0]] - c[b[n - 1]]) - 1;
    cout<<max(0, ans);
    return 0;
}

三,打印直角三角形

P1064 - 打印直角三角形 - New Online Judge (ecustacm.cn)

 

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n) {
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= i; ++j)
                cout<<"*";
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

注意,图形用空行分开 

四,最大值和最小值(II)

P1065 - 最大值和最小值(II) - New Online Judge (ecustacm.cn)

 

一开始排序写成sort(a, a + n).....所以Ac 20%,改成sort(a, a + 3)就好了

#include<iostream>
#include<algorithm> //sort()
#include<cstring> //memset()
using namespace std;
int a[4]; //保存每只队伍分数
int main()
{
    int n, ans = 10000, num;
    cin>>n;
    for(int i = 1; i <= n; ++i) {
        memset(a, 0, sizeof(a)); //每只队伍都要更新a
        for(int j = 0; j < 3; ++j) {
            cin>>a[j];
        }
        sort(a, a + 3);
        if(ans > a[2] - a[0]) {
            ans = min(ans, a[2] - a[0]);
            num = i;
        }
    }
    cout<<num;
    return 0;
}

虽说memset速度慢,但是只有三个数据的话,每次更新一下不影响

五,消消乐(一题多解)

给大家展示下一题多解 

题目 

P1066 - 消消乐 - New Online Judge (ecustacm.cn)

 

解析 

1,s.substr(i)下标 i 开始到结尾,s.substr(i, j)从下标 i 开始截取 j 个字符(代码1)

2,其实用删除函数更好(代码2)

3,当然用也可以(代码3)

第一次发现个小问题,用s.substr()写了删除函数后,发现全局变量在构造函数被修改后,主函数中并没有被改变,苦苦思索了半小时发现,忘记return了......↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

#include<iostream>
#include<cstring> //substr()
using namespace std;
string s;

void cut(string s) //消去一次
{
    int r = 0;
    for(int i = 1; i < s.size(); ++i) {
        if(s[i] == s[i - 1]) r++;
        else r = 0;
        if(r == 2) {
            s = s.substr(0, i - 2) + s.substr(i + 1);
            cout<<"函数中全局变量被修改了:"<<s<<endl;
            break;
        }
    }
}
int main()
{

    cin>>s;
    cut(s);
    cout<<"主函数中输出不变:"<<s;
    return 0;
}
aaaabbbc
函数中全局变量被修改了:abbbc
主函数中输出不变:aaaabbbc

忘记return浪费半小时 

改成这样即可

#include<iostream>
#include<cstring> //substr()
using namespace std;
string s;

string cut(string s) //这里要加*, 否则主函数中不变
{
    int r = 0;
    for(int i = 1; i < s.size(); ++i) {
        if(s[i] == s[i - 1]) r++;
        else r = 0;
        if(r == 2) {
            s = s.substr(0, i - 2) + s.substr(i + 1);
            cout<<"函数中全局变量被修改了:"<<s<<endl;
            return s;
            break;
        }
    }
}
int main()
{

    cin>>s;
    s = cut(s);
    cout<<"主函数中输出不变:"<<s;
    return 0;
}
aaaabbbc
函数中全局变量被修改了:abbbc
主函数中输出不变:abbbc

首先声明函数时,要声明为string;其次,函数中修改s后,必须return; 最后,主函数中函数的return要赋值给一个变(大坑

字符串操作函数 

1,截取子串

s.substr(i)下标 i 开始到结尾,s.substr(i, j)从下标 i 开始截取 j 个字符

2,替换子串

s.replace(i, j, s1)用s1替换s中从下标 i 开始的 j 个字符

3,查找子串

s.find(s1)查找s1在s第一次出现的下标

s.rfind(s1)查找s1在s最后一次出现的下标

4,删除子串

s.erase(i, j)删除从下标 i 开始的 j 个字符 

代码1  s.substr(i, j)

#include<iostream>
#include<cstring> //substr()
using namespace std;
string s;
int flag = 1;
string cut(string s)
{
    flag = 0;
    int r = 0;
    for(int i = 1; i < s.size(); ++i) {
        if(s[i] == s[i - 1]) r++;
        else r = 0;
        if(r == 2) {
            flag = 1; //可能还存在3个连续的
            s = s.substr(0, i - 2) + s.substr(i + 1);
            return s;
            break;
        }
    }
    return s; //最后一步return s; 别漏了
}
int main()
{
    cin>>s;
    while(flag) {
        s = cut(s);
    }
    cout<<s.size()<<endl<<s;
    return 0;
}

1,代码第15行,i - 2 和 i + 1 的规律,可以自己在草稿纸罗列acbbbab对应着下标0~6试试

2,cut()函数结尾的return s; 也是个坑

代码2  s.erase(i , j) 

#include<iostream>
//#include<cstring>
using namespace std;
string s;
int flag = 1;
string cut(string s)
{
    flag = 0;
    int r = 0;
    for(int i = 1; i < s.size(); ++i) {
        if(s[i] == s[i - 1]) r++;
        else r = 0;
        if(r == 2) {
            flag = 1; //可能还存在3个连续的
            s.erase(i - 2, 3); //从i - 2开始,删除3个
            return s;
            break;
        }
    }
    return s; //最后一步return s; 别漏了
}
int main()
{
    cin>>s;
    while(flag) {
        s = cut(s);
    }
    cout<<s.size()<<endl<<s;
    return 0;
}

 也就把代码1第15行换成了      s.erase(i - 2, 3);

代码3   栈

s.pop()仅删除栈顶元素,不返回元素,返回void;而s.top()返回栈顶元素,不删除;

s.push()将元素入栈

C++ STL 之stack_buyizhu021的博客-CSDN博客_stack赋值

 

经过对stack的学习(半小时),再耗费半小时,,还是没完全靠自己敲出来,抄吧

抄着抄着就会了

#include<iostream>
#include<stack> //st.pop(), st.push()
#include<algorithm> //reverse()
using namespace std;
string s;

string cut(string s) //声明全局就别传参了
{
    stack<char>st; //记住这种格式
    for(int i = 0; i < s.size(); ++i) {
        if(st.size() >= 2) { //此处'>'不可少,否则只消去一次
            //获取两个元素的值
            int a = st.top(); //第一个
            st.pop(); //第一个出栈
            int b = st.top(); //第二个
            st.push(a); //恢复原样
            if(s[i] == a && a == b) {//3个元素一样
                st.pop();
                st.pop();
            }
            else st.push(s[i]); //不一样就把第三个也入栈
        }
        else st.push(s[i]); //栈里元素不足2个
    }
    s = ""; //初始化s为空串
    while(!st.empty()) {
        s += st.top();
        st.pop();
    } //栈后进先出,所以字符串反转
    reverse(s.begin(), s.end());
    return s;
}
int main()
{
    cin>>s;
    s = cut(s);
    cout<<s.size()<<endl<<s;
    return 0;
}

六,按纯度筛选(超限!!)

P1067 - 按纯度筛选 - New Online Judge (ecustacm.cn)

 

1,第一次报错error: can not convert ... to const char*,因为我strcmp来比较string类的字符串,把string类改成char就好

2,结构体是变量的集合体,切记

3,第二次发现,写的统计字母种类的函数ki()没起作用,原来是数组a[]没有初始化,连0都没有何来++,a[26]改成a[26] = {0},而且设置26为长度的话,遍历时下标要从0开始,否则超限也会输出错误答案 

4,第三次!测试样例 + 自己编的包含所有情况的七八组数据,都没问题,但是提交就答案错误。。。what's wrong...

5,🤮 🤮🤮🤮发现问题了,第13行26个桶设置成a[26]会超限,导致你这里结果对,但是系统不给你过,a[26] ----> a[30]AC了🤮

AC代码

#include<iostream>
#include<cstring> //strcmp(),比较字典序;strlen()
#include<algorithm> //sort()
using namespace std;
struct stone
{
    int len, kind; //长度和种类
    char ss[110];
}s[110];

int ki(char s[]) //得到纯度
{
    int kind = 0, a[30] = {0}; //a[30]表示26个桶,设置30防止超限
    for(int i = 0; i < strlen(s); ++i)
        if(a[s[i] - 'a' + 1] == 0) {
            a[s[i] - 'a' + 1] = 1;
            kind++;
        }
    return kind;
}

bool cmp(stone x, stone y) //三种比较规则
{
    if(x.kind != y.kind)
        return x.kind < y.kind; //返回纯度高的
    else if(x.len != y.len)
        return x.len > y.len; //返回长度大的
    else //如果纯度长度都相等
        return strcmp(x.ss, y.ss) < 0; //返回字典序小的
}

int main()
{
    int n;
    while(cin>>n) {
        if(n == 0) break;
        for(int i = 0; i < n; ++i) {
            cin>>s[i].ss;
            s[i].kind = ki(s[i].ss);
            s[i].len = strlen(s[i].ss);
        }
        sort(s, s + n, cmp);
        for(int i = 0; i < n; ++i) {
            cout<<s[i].ss<<endl;
        }
        cout<<endl;
    }
    return 0;
}

七,加密数(溢出!!)

P1068 - 加密数 - New Online Judge (ecustacm.cn)

要做出这题,首先要了解十进制的二进制表示方法,其次是原码反码补码 

(6条消息) 原码、反码、补码详解_独在黑夜_看湖面的博客-CSDN博客_原码反码补码

首先,经过计算 2^7 + 2^8 + 2^16 == 65920,

每8位作为一个整体,130 = 0 + 2^0 + 2^0 + 2^7

负数的二进制在计算机中表示为补码,即原码基础上,除符号位外取反+ 1

-1

原码为10000000 00000000 00000000 00000001

反码为11111111 11111111 11111111 11111110

补码(也就是计算机中形式)11111111 11111111 11111111 11111111

所以-1的加密数为 (1+2+4+8+16+32+64+128) * 4 = 1020

我们要做的是,写个将负数转换为补码的函数(详细步骤看代码注释) 

害,整了20个从0到10^9+的数据,包括10个对应负数,跑对拍都没问题。。是系统的问题?

找到原因了!!第5行int c要改long long,因为传入时确实在 int 范围内,但是函数中操作时,可能会取反,比如2^31的二进制取反,由于是无符号整型,会超出int范围(溢出

Ac代码 

#include<iostream>
#include<cstring> //memset()
using namespace std;
int a[100];
void binary(long long c, int b[])
{
    int flag = 0;
    if(c < 0) {
        c = -c;
        flag = 1;
    }
    for(int i = 0; i < 32; ++i) { //转二进制
        b[i] = c % 2;
        c /= 2; //最低位存入数组第一位
    }
    if(flag) {
        for(int i = 0; i < 32; ++i) { //取反,变反码
            if(b[i] == 0) b[i] = 1;
            else if(b[i] == 1) b[i] = 0;
        }
        for(int i = 0; i < 32; ++i) { //加1, 变补码
            if(b[i] == 0) {b[i] = 1; break;}
            else b[i] = 0;
        }
    }
}
int main()
{
    int n;
    while(cin>>n) {
        memset(a, 0, sizeof(a)); //初始化数组
        int ans = 0;
        binary(n, a);
        int pro = 1;
        for(int i = 0; i < 32; ++i) { //计算答案
            if(i % 8 == 0) pro = 1; //每8位作为整体
            if(a[i] == 1) ans += pro;
            pro *= 2;
        }
        cout<<ans<<endl;
    }
    return 0;
}

总结 

1,加深了对函数传参return全局变量的了解

2,初步学习了用特例推翻代码,并重构的方法

3,学会跳出思维定势,比如sort(a, a + n)也可能是sort(a + 1, a + n + 1),sort(a, a + 3)......

4,初步学习并运用s.substr(i, j), s.erase(i, j)解决问题(头文件#include<cstring>

      并通过一题多解锻炼解题能力

5,数组超限!老生常谈了,每次最好多设10个长度,多设死不了,少了一定不行

6,int溢出的问题,但这次是初始没溢出,后续操作导致数据超过2^31才溢出的,大坑 

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

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

相关文章

Qt扫盲-QTime理论总结

QTime理论总结一、概述二、使用1. 属性获取2. 时间加减3. 字符串与QTime互转一、概述 QTime对象包含一个时钟时间&#xff0c;可以用小时数、分钟数、秒数和毫秒数来表示。它提供了比较时间和通过添加毫秒数来操作时间的函数。 QTime使用24小时时钟格式&#xff1b;它没有AM/…

bigemap如何设置等高线坐标系并输出

如何设置等高线坐标系并输出发布时间&#xff1a;2018-01-17 版权&#xff1a;投影设置及数据导出矢量等高线生成完成后&#xff08;详细生成过程参加上一章节&#xff1a;矢量等高线生成&#xff09;,我们就能够设置投影和导出等高线数据。投影设置我们生成等高线默认的坐标是…

大数据集群环境搭建

文章目录本文要点内容大纲一、大数据集群环境搭建1.1、分布式、集群概念初识1.2、集群环境搭建1.2.1、虚拟机克隆1.2.2、修改IP、主机名1.2.3、主机名和IP映射配置1.2.4、防火墙关闭1.2.5、集群机器间免密登录1.2.6、跨机器远程copy文件1.2.7、集群的时间同步问题二、Centos软件…

【3】Linux权限管控

学习笔记目录 初识Linux--入门Linux基础命令--会用Linux权限管控--懂权限Linux实用操作--熟练实战软件部署--深入掌握脚本&自动化--用的更强项目实战--学到经验云平台技术--紧跟潮流 认知root用户 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、L…

【iMessage苹果家庭推推送源码】掀开应用程序“终端”,输入CDDESKTOP运转指令证书

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

沁恒CH32V307单片机入门(01):基础说明与流程体验

文章目录目的基础说明芯片介绍资料与工具开发环境流程体验开发调试下载总结目的 工作这几年单片机主要就接触过 Atmel、Renesas、Microchip、ST 这些厂家的&#xff0c;最近几年因为内部外部的各种因素单片机的价格和供应都挺不稳定的&#xff0c;将来会发生什么也不好说。另外…

python jenkins使用方法/使用笔记

笔者也经常在网上查询信息,但发现很多信息都是照搬,内容甚至有错误,可用性很低.笔者就认为如果要分享就应该把遇到的问题真实的分享出来,让更多同路人少走弯路.节约时间.觉得这篇文章有帮助的同学可以点个赞!将真有用的信息传递给更多人!常用的方法安装 jenkins 依赖pip instal…

python+django校园失物招领系统_13i29.

用户注册&#xff1a;用户填写用户名、密码、年级、姓名、电话号码、邮箱 &#xff0c;然后点击注册按钮进行注册。 用户登录&#xff1a;用户填写已经注册的用户名和密码并输入验证码&#xff0c;点击登录按钮进行登录。 搜索&#xff1a;用户可以在搜索栏输入关键字进行检索&…

京阳科技拟在上交所上市:计划募资12亿元,业绩波动较大

近日&#xff0c;山东京阳科技股份有限公司&#xff08;下称“京阳科技”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;京阳科技计划募资12亿元&#xff0c;用于10万吨/年新能源锂电池材料前驱体项目。 据招股书介绍&#xff0…

【刷题】珠玑妙算

至此&#xff0c;我终于明白了哈希表真正的妙用。 目录 文章目录 前言 一、珠玑妙算 二、具体实现 1.哈希表的构建 2.总结规律 1&#xff09;给出两个字符串&#xff1a;"YBBY"&#xff0c;"GYYB"&#xff0c;构建哈希表&#xff1a;&#xff08;少猜了一个…

ch2 计算机的发展史

1. 计算机的发展史 人类活动的需求&#xff0c; 推动因素&#xff1a; 电子技术的发展计算机体系结构技术的发展 1. 1 计算机的体系结构 冯诺依曼 体系结构的计算机&#xff1b; 以运算器为核心的 冯诺依曼结构&#xff1b; IBM 360 &#xff1a; 提出计算机系统结构的概念…

DeepTime:时间序列预测中的元学习模型

DeepTime&#xff0c;是一个结合使用元学习的深度时间指数模型。通过使用元学习公式来预测未来&#xff0c;以应对时间序列中的常见问题&#xff08;协变量偏移和条件分布偏移——非平稳&#xff09;。该模型是时间序列预测的元学习公式协同作用的一个很好的例子。 DeepTime架…

Win系统速览桌面功能失效 - 解决方案

Win系统速览桌面功能失效 - 解决方案问题解决方案步骤1&#xff1a;确保显卡驱动正常运行步骤2&#xff1a;检查任务栏设置步骤3&#xff1a;调整视觉效果问题 Win10系统支持用户鼠标悬停在任务栏右下角时速览桌面。但可能会因驱动和视觉效果设置等原因导致此功能失效。甚至任…

Linux基础IO+文件fd

1&#xff1a;文件理解文件内容属性&#xff0c;因此空文件在磁盘上也占用空间。文件用路径名文件名作为标识文件的唯一性。对文件的操作&#xff0c;就是对文件的内容属性的操作。在linux中&#xff0c;如果没有指定文件路径&#xff0c;默认在当前路径下执行操作。总结&#…

react配置环境变量

前端项目开发一般会区分三个环境&#xff1a; 本地环境&#xff08;及开发环境&#xff09;— development&#xff0c;测试环境 — test&#xff0c;生产环境 — production。 本地环境就是自己开发调试用的&#xff0c;一般是node起一个本地的服务&#xff0c;用webpack做接…

使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格

每当有新员工入职&#xff0c;人事小姐姐都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;看到小姐姐这么辛苦&#xff0c;我就忍不住要去帮她了… 于是我用1行代码就实现了自动识别银行卡信息并且自动生成Excel文件&#xff0c;小姐姐当场就亮眼汪汪的看着…

如何制定一个好计划?运用SMART原则

很多人面对目标总是给自己找各种借口&#xff0c;为自己找理由&#xff0c;如没时间、做不到、没人脉、在潜意识里告诉自己还没准备好。人的天性就是逃避困难、贪图享乐&#xff0c;而保证执行力就是跟惰性抗争的过程。 这个世界没有好做不好的工作&#xff0c;只有&#xff0c…

Java Springboot+VUE前后端分离网上手机商城平台系统设计和实现以及论文报告

Java SpringbootVUE前后端分离网上手机商城平台系统设计和实现以及论文报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收…

闭区间连续函数的性质+习题课(函数与极限总复习)——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天我们的内容依然是关于连续函数的概念和性质及相关内容&#xff0c;之前的博客我们学习到了函数的连续性和函数的间断点&#xff0c;那今天&#xff0c;我们便来看看闭区间上连续函数的性质&#xff0c;好的&#xff0c;接下来就让我们进…

Webpack麻烦你不要靠的那么近,我怕Vite误会

某天&#xff0c;实施人员&#xff0c;让我修复了一个小问题&#xff0c;并需要快速的发布到正式环境上&#xff0c;我三下五除二修改了问题&#xff1b;开始了打包发布&#xff0c;以前并没有怎么注意到启动的问题&#xff0c;然而这次比较急&#xff0c;想在用户看到之前发布…