ZISUOJ 高级语言程序设计实训-基础B(部分题)

news2024/11/15 12:43:58

说明:

        有几个题是不会讲的,我只能保证大家拿保底分。

题目列表:

问题 A: 统计字母个数

思路:

        把'a'到'z'放map里处理后输出即可。

参考题解:

#include <iostream>
#include <string>
#include <map>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    std::string s;
    std::map<char,int> mp;
    for(int i = 0;i<26;i++) mp['a'+i] = 0;
    while(cin >> s) {
        for(auto &c:s) if(c>='a'&&c<='z') mp[c]++;
        if(s[s.size()-1]=='#') break;
    }
    for(auto &i:mp) {
        cout << i.first << ' ' << i.second << '\n';
    }
    return 0;
}

问题 B: 小数化分数1

思路:

        以字符串形式读入小数,从第三个字符开始统计,分子初始化为0,分母初始化为1,分子每次乘以10再加上字符-'0'的值(或者直接异或48也能实现同样的效果),分母每次乘以10,把两个数都除以它们的最大公约数再输出即可。

参考题解:

#include <iostream>
#include <string>
#include <algorithm>
using std::cin;
using std::cout;
void solve() {
    std::string n;cin >> n;
    int fenzi = 0,fenmu = 1;
    for(int i = 2;i<n.size();i++) {
        fenzi = fenzi*10+(n[i]^48);
        fenmu *= 10;
    }
    int gcd = std::__gcd(fenzi,fenmu);
    cout << fenzi/gcd << '/' << fenmu/gcd << '\n';
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int T = 1;cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

问题 C: 筛排处理

思路:

        把数据都放进set里面,注意一下输出的格式即可。

参考题解:

#include <iostream>
#include <set>
using std::cin;
using std::cout;
void solve(int &n) {
    std::set<int> set;
    for(int i = 1;i<=n;i++) {
        int tmp;cin >> tmp;
        set.insert(tmp);
    }
    int count = 0;
    cout << set.size() << '\n';
    for(auto &i:set) {
        count++;
        cout << i << " \n"[count%10==0];
    }
    if(count%10!=0) cout << '\n';
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 1;
    while(cin >> n) {
        if(n==0) {
            cout << "0\n";
            break;
        }
        solve(n);
        cout << '\n';
    }
    return 0;
}

问题 D: 产生冠军

思路:

        读入所有比赛结果,第一遍遍历时把每场比赛的胜者都放入winner候选人名单中(实际上就是丢进set中),第二遍遍历时把每场的败者从winner候选人名单中剔除,最后判断winner候选人名单的大小,如果size为1,则可以唯一确定winner,否则则不行。

参考题解:

#include <iostream>
#include <string>
#include <vector>
#include <set>
using std::cin;
using std::cout;
void solve(const int &n) {
    std::vector<std::pair<std::string,std::string>> competitions;
    std::set<std::string> set;
    for(int i = 0;i<n;i++) {
        std::string winner,loser;
        cin >> winner >> loser;
        competitions.emplace_back(winner,loser);
        set.insert(winner);
    }
    for(int i = 0;i<n;i++) {
        set.erase(competitions[i].second);
    }
    cout << (set.size()==1?"Yes\n":"No\n");
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 1;
    while(cin >> n,n) {
        solve(n);
    }
    return 0;
}

问题 F: 恺撒密码

思路:

        基本的字符变换题,这里注意读入的问题即可。用C语言的gets()读入需要提前把上一行的换行符读掉,用C++的getline()读入时也要用cin.get()或者再用一个getline()把换行符读掉。

参考题解:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 1;cin >> n;
    // std::cin.get();
    std::string s,temps;
    getline(cin,temps);
    getline(cin,s);
    for(auto &c:s) {
        if(c>='a'&&c<='z') {
            cout << char('a'+(c-'a'+n)%26);
        }else cout << char(c);
    }
    cout << std::endl;
    return 0;
}

问题 G: 切割正方体

思路:

        考察思维,所有能切出的立方体都不大于长方体的长宽高的最大公约数,因此我们只需要计算长宽高的最大公约数的因子个数即可。

参考题解:

#include <iostream>
#include <algorithm>
#include <vector>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int length,width,height;
    while(cin >> length >> width >> height,length||width||height) {
        int common_gcd = std::__gcd(std::__gcd(length,width),height);
        std::vector<int> factor;
        for(int i = 1;i<=common_gcd/i;i++) {
            if(common_gcd%i==0) {
                factor.emplace_back(i);
                if(i!=common_gcd/i) {
                    factor.emplace_back(common_gcd/i);
                }
            }
        }
        cout << factor.size() << '\n';
    }
    return 0;
}

问题 H: 核反应堆

思路:

        模拟一下每一秒发生的事情即可。注意此处可能会爆int,因此要开long long。

参考题解:

#include <iostream>
using ll = long long;
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 1;
    while(cin >> n,n!=-1) {
        ll high=1,low=0;
        for(int i = 1;i<=n;i++) {
            ll temp_high = high,temp_low = low;
            high = temp_high*3+temp_low*2;
            low = temp_high+temp_low;
        }
        cout << high << ", " << low << '\n';
    }
    return 0;
}

问题 I: 天花板

思路:
        实现向上取整即可。直接用写好的函数(<cmath>头文件中的ceil()函数)即可。

参考题解:

#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 1;cin >> n;
    for(int i = 1;i<=n;i++) {
        double number;cin >> number;
        cout << std::ceil(number) << '\n';
    }
    return 0;
}

问题 K: 统计立方数

思路:

        打个表把unsigned int范围内的所有立方数都放进vector中,之后读入数据时去这个vector使用二分查找,如果找到了,则ans++,否则continue

参考题解:

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using ll = long long;
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    std::vector<ll> cubes;
    for(ll i = 1;i*i*i<=UINT_MAX;i++) {
        cubes.emplace_back(i*i*i);
    }
    ll n,ans = 0;
    while(cin >> n,n) {
        if(std::binary_search(cubes.begin(),cubes.end(),n)) {
            ans++;
        }
    }
    cout << ans << std::endl;
    return 0;
}

问题 M: 剪花布条

思路:

        字串查找题,可以用暴力匹配、kmp算法等思路。我这里直接用<string>头文件的find()类函数实现的查找。

参考题解:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    std::string s,subs;
    while(cin >> s,s!="#") {
        cin >> subs;
        int index = 0,ans = 0;
        while(s.find(subs,index)!=std::string::npos) {
            index = s.find(subs,index)+subs.size();
            ans++;
        }
        cout << ans << '\n';
    }
    return 0;
}

问题 N: 不要62

思路:

        根据数据范围10^6,我直接使用最暴力的方法,遍历n到m,每个遍历到的数,都把它转成字符串,再使用<string>的find()函数来查找'4'和'62',如果找到了,count++,否则continue,最后输出m-n+1-count即可。

参考题解:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n,m;
    while(cin >> n >> m,n||m) {
        int count = 0;
        for(int i = n;i<=m;i++) {
            std::string s = std::to_string(i);
            if(s.find('4')!=std::string::npos||s.find("62")!=std::string::npos) {
                count++;
            }
        }
        cout << m-n+1-count << '\n';
    }
    return 0;
}

问题 O: 过原点的直线数

思路:

        要判断是否存在点与原点(0,0)的连线也经过了其他点,最简单的方式是求出所有点(xi,yi)的最大公约数,都放进set中去重输出set的大小即可。

参考题解:

#include <iostream>
#include <set>
#include <algorithm>
using std::cin;
using std::cout;
void solve() {
    int n;cin >> n;
    std::set<std::pair<int,int>> slopes;
    for(int i = 1;i<=n;i++) {
        int x,y;cin >> x >> y;
        int gcd = std::__gcd(x,y);
        slopes.insert(std::make_pair(x/gcd,y/gcd));
    }
    cout << slopes.size() << '\n';
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int T = 1;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

问题 P: 数的计数

思路:

        很明显的dfs题,注意写的时候容易爆int,记得开long long。

参考题解:

#include <iostream>
#include <cstring>
using ll = long long;
using std::cin;
using std::cout;
void dfs(int u,ll *a) {
    if(a[u]!=-1) return;
    a[u] = 1;
    for(int i = 1;i<=u/2;i++) {
        dfs(i,a);
        a[u]+=a[i];
    }
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e3+5;
    ll a[N];
    memset(a,-1,sizeof a);
    int n;cin >> n;
    dfs(n,a);
    cout << a[n] << std::endl;
    return 0;
}

问题 Q: 排列

思路:

        dfs入门最经典的题目,不过此题要注意输出的格式。我就不写dfs了,直接用STL的全排列函数了。

参考题解:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e1+5;
    int n = 1;cin >> n;
    for(int i = 1;i<=n;i++) {
        int a[N];
        for(int j = 1;j<=4;j++) {
            cin >> a[j];
        }
        std::sort(a+1,a+1+4);
        std::vector<std::string> ans;
        do {
            std::string s;
            for(int i = 1;i<=4;i++) s = s+char(a[i]^48);
            ans.emplace_back(s);
        }while(std::next_permutation(a+1,a+1+4));
        for(int j = 0;j<ans.size();j++) {
            cout << ans[j] << " \n"[(j+1)%6==0];
        }
        if(i!=n) cout << '\n';
    }
    return 0;
}

问题 R: 排列2

思路:

        是上个题的hard版本,只需要注意全排列第一个元素为0时丢弃,其他情况都放进vector中,再排序去重,但是注意输出的格式。

参考题解:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int a,b,c,d;
    int num[5];
    while(cin >> a >> b >> c >> d,a||b||c||d) {
        num[1] = a,num[2] = b,num[3] = c,num[4] = d;
        std::sort(num+1,num+1+4);
        std::vector<std::string> ans;
        do {
            if(num[1]==0) continue;
            std::string s;
            for(int i = 1;i<=4;i++) {
                s = s + char(num[i]^48);
            }
            ans.emplace_back(s);
        }while(std::next_permutation(num+1,num+1+4));
        std::sort(ans.begin(),ans.end());
        char last = ans[0][0];
        for(int i = 0;i<ans.size();i++) {
            if(ans[i][0]!=last) {
                cout << '\n' << ans[i] << ' ';
                last = ans[i][0];
            }else {
                cout << ans[i] << ' ';
            }
        }
        cout << '\n' << '\n';
    }
    return 0;
}

问题 S: 最多拦截导弹数

思路:

        第一眼看到题,还以为是最经典的动态规划的最长上升子序列模型题,结果只是一个很傻的贪心题,直接写即可。

参考题解:

#include <iostream>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e3+5;
    int n;
    while(cin >> n,n) {
        int height[N];
        for(int i = 1;i<=n;i++) cin >> height[i];
        int now = 30000,ans = 0;
        for(int i = 1;i<=n;i++) {
            if(now>=height[i]) {
                now = height[i];
                ans++;
            }else break;
        }
        cout << ans << '\n';
    }
    return 0;
}

问题 T: 昊城的分割游戏

思路:

        题目看着很唬人,以为要用什么很复杂的数据结构或者算法思想,但是推几个样例就会发现答案不是0就是1,而且只跟读入数据对4取模的值有关。

参考题解:

#include <iostream>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;cin >> n;
    cout << (n%4==1||n%4==2?1:0) << std::endl;
    return 0;
}

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

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

相关文章

台灯的功能作用有哪些?分享护眼灯排行榜前十名

说到台灯相信大家都不陌生&#xff0c;基本家家户户都会备上一台&#xff0c;不过也有家长存在疑惑&#xff0c;台灯的功能作用有哪些呢&#xff1f;其实台灯最主要的作用就是补充桌面不足的照明&#xff0c;一般单靠室内灯提供亮度是远远不够的&#xff0c;容易造成桌面亮度不…

“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法

原文链接&#xff1a;“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601940&idx6&sn515e01666037570939aaf0eee56f46d1&chksmfa820ef3cdf587e5276eac181c890026b6ca4bc36ce0e4f80d89d…

Linux开机启动流程

Linux开机启动流程详细步骤如下图&#xff1a; 其中&#xff1a; POST:Power On Self Test --加电自检 BIOS: Basic Input Output System --基础输入输出系统 MBR: Master Boot Record --主引导记录 GRUB: GRand Uni…

【electron3】electron将数据写入本地数据库

安装 yarn add sqlite3 --save连接并调用数据库&#xff0c;创建表 createDB.ts文件内容 const sqlite3 require(sqlite3) const NODE_ENV process.env.NODE_ENV const path require(path) const { app } require(electron) let DB_PATH path.join(app.getAppPath(), /…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

vue基础语法学习

Object.defineProperty方法的使用 // 这是一个普通的对象 let phone {} // 给这个phone新增一个属性 三个参数&#xff1a;新增属性的对象&#xff0c;新增啥属性&#xff0c;属性值&#xff0c;key value对 Object.defineProperty(phone,color,{value:太空灰, //设置属性值wr…

互联网大厂ssp面经,数据结构part2

1. 什么是堆和优先队列&#xff1f;它们的特点和应用场景是什么&#xff1f; a. 堆是一种特殊的树形数据结构&#xff0c;具有以下特点&#xff1a;i. 堆是一个完全二叉树&#xff0c;即除了最后一层外&#xff0c;其他层都是满的&#xff0c;并且最后一层的节点都靠左对齐。i…

【css】select实现placeholder效果

场景&#xff1a;使用select下拉选择框的时候&#xff0c;需要像其他控件一样提示默认信息。 问题&#xff1a;表单控件select没有placeholder属性。 解决方案&#xff1a;通过css实现&#xff0c;不需要js <style>select > option[disabled]{ color:#999;cursor: n…

【数据结构(邓俊辉)学习笔记】向量01——接口与实现

文章目录 0.意图1、概述2 从数组到向量3 向量ADT接口4 Vector 模板类5 构造与析构5.1默认构造方法5.2基于复制的构造方法5.3 析构方法 0.意图 一方面是将工作学习中零星的知识点串起来&#xff0c;另一方面向量是其他数据类型的基础&#xff0c;比如栈队列等&#xff0c;所以基…

【C语言】每日一题,快速提升(10)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;圣诞树 输入&#xff1a; 1输出&#xff1a; * * * * * **说明&#xff1a; 输入&#xff1a; 2输出&#xff1a; * * * * * * * …

近年数一,数二难度如何,听说24是像张宇那样的题?

直接上分数&#xff01; “估分一百零几&#xff0c;平时李林130-140&#xff0c;张八110-125的样子&#xff0c;超越做的分数也是100出头。” 24学长说&#xff1a; “远离李林张八&#xff01;张四没做不评价。” “李林张八暑假前做完当作打基础即可。超越才是真题难度”…

WordPress social-warfare插件XSS和RCE漏洞【CVE-2019-9978】

WordPress social-warfare插件XSS和RCE漏洞 ~~ 漏洞编号 : CVE-2019-9978 影响版本 : WordPress social-warfare < 3.5.3 漏洞描述 : WordPress是一套使用PHP语言开发的博客平台&#xff0c;该平台支持在PHP和MySQL的服务器上架设个人博客网站。social-warfare plugin是使用…

获取肖博数学全套视频+讲义

肖博数学是一个专业团队&#xff0c;教学方法非常颠覆&#xff0c;具有很多技巧&特殊的解题方法内容&#xff0c;能使得学生在高考时冲刺高分 hello&#xff0c;今天分享一下高中数学资料&#xff0c;肖博数学&#xff0c; 他们的教学方法与传统的教学方式有所不同&#…

使用HTML+css+js+jQuery完成,输入用户信息,转换为数据表格

案例图 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>User Information Form</ti…

基于vue+node+mysql的视频校对系统

一、登录注册&#xff1a;包括登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;验证码等常用点。 二、用户管理&#xff1a;包括用户的增删改查 三、权限管理&#xff08;请增加这个权限&#xff1a;任务分配——只有管理者才能发布和删除任务&#xff1b;管理员设置。 四…

HTML中的文档声明

前言 什么是<!DOCTYPE>&#xff1f;是否需要在 HTML5 中使用&#xff1f;什么是严格模式与混杂模式&#xff1f; 文档声明概念 HTML 文档通常以文档声明开始&#xff0c;该声明的作用是帮助浏览器确定其尝试解析和显示的 HTML 文档类型。 <!DOCTYPE html>文档声…

轻松搭建llama3Web 交互界面 - Ollama + Open WebUI

Ubuntu下安装&#xff1a;&#xff08;官网&#xff1a;Download Ollama on Linux&#xff09; curl -fsSL https://ollama.com/install.sh | sh 就运行起来ollama了&#xff0c;不放心可以用ollama serve查看一下 ollama run llama3 就可以跑起来了&#xff0c; 那么我们肯…

DFS与回溯专题:路径总和问题

DFS与回溯专题&#xff1a;路径总和问题 一、路径总和 题目链接&#xff1a; 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索&#xff0c;递归计算每条路径的节点值之和&#xff0c;当某个节点的左右子节点都为空时&#xff0c;说明已经搜索完成某一条路径&#xff0…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

Hadoop实战——MapReduce-字符统计(超详细教学,算法分析)

目录 一、前提准备工作 启动hadoop集群 二、实验过程 1.虚拟机安装先设置端口转发 2.上传对应文件 3.编写Java应用程序 4. 编译打包程序 5. 运行程序 三、算法设计和分析 算法设计 算法分析 四、实验总结 实验目的&#xff1a;给定一份英文文本&#xff0c;统计每个…