C++学习笔记3
A. 求出那个数
题目描述
喵喵是一个爱睡懒觉的姑娘,所以每天早上喵喵的妈妈都花费很大的力气才能把喵喵叫起来去上学。
在放学的路上,喵喵看到有一家店在打折卖闹钟,她就准备买个闹钟回家叫自己早晨起床,以便不让妈妈这么的辛苦。但是想到自己睡觉睡的太死了,一个闹钟可能并不能够把自己叫醒,所以她决定买一些闹钟回家一起用。
但是 n n n 个闹钟的音量并不是一个闹钟音量的 n n n 倍,而是存在一个很奇怪的数学关系:
a n = { 1 n ≤ 2 a n − a n − 1 + a n − 1 − a n − 2 n > 2 a_n=\begin{cases} 1 & n\le2 \\ a_{n-a_{n-1}}+a_{n-1-a_{n-2}} & n>2 \end{cases} an={1an−an−1+an−1−an−2n≤2n>2
现在喵喵想请你帮忙计算 n n n 个闹钟的音量会有多大,请你写个程序帮忙计算。
输入格式
多组输入。
每组输入在一行中给出一个正整数 n n n。
当 n = 0 n=0 n=0 时表示输入结束。
- 1 ≤ n ≤ 1 0 6 1\le n\le10^6 1≤n≤106
输出格式
每组输入在一行中输出 n n n 个闹钟的音量总和。
样例
输入 #1
1
2
3
5
10
0
输出 #1
1
1
2
3
6
- 按照题目的要求递推过去即可。
#include <bits/stdc++.h>
using namespace std;int a[1000010];void solve()
{int _;cin >> _;while (_){cout << a[_] << '\n';cin >> _;}
}signed main()
{a[1] = a[2] = 1;for (int i = 3;i <= 1000000;i++){a[i] = a[i-a[i-1]]+a[i-1-a[i-2]];}int TTT;
// cin >> TTT;TTT = 1;while (TTT--) solve();return 0;
}
B. 加密通话
题目描述
在这个信息十分发达的时代,喵喵十分担心自己发送的消息被黑客拦截,因此他决定将内容加密。她和同学一起发明了一种加密方法,因为他们要加密的文字只有大写字母和空格,所以她们一起约定空格编号就是 0 0 0, A A A 标号就是 1 1 1, … \dots …, Z Z Z 编号就是 26 26 26,然后再将每个编号转为长度为 5 5 5 的二进制数以后,按照螺旋方阵的方式填入一个 R × C R\times C R×C 的矩阵中,若二进制串不够长就在后面补 0 0 0。
例如 R = 4 , C = 4 R=4,C=4 R=4,C=4 时,加密 BEE, B = 00010 , E = 00101 , E = 00101 B=00010,E=00101,E=00101 B=00010,E=00101,E=00101。末尾补零填进矩阵后是这样:
0001
0100
0010
1010
然后我们再将矩阵中的元素一行一行的取出来,得到加密后的信息就是
0001010000101010 0001010000101010 0001010000101010。如果通信全靠手算的话,那就急死人了,现在先请你来实现一个加密程序来将信息进行加密。
输入格式
输入仅在一行中给出 R , C R,C R,C,以及要加密的字符串 S S S。
保证 R , C R,C R,C 不会超过 20 20 20,且 R × C R\times C R×C 不会小于五倍的字符串的长度。
S S S 中可能含有空格!
输出格式
在一行中输出加密后的结果。
样例
输入 #1
4 4 BEE
输出 #1
0001010000101010
- 注意输入有空格
- 转二进制之后不足五位前面要补零
- 整个二进制串长度不足 R × C R\times C R×C 末尾要补零
- 最后填进矩阵遍历即可
#include <bits/stdc++.h>
//#define int long long
using namespace std;int n,m;
string s;
map <char,string> mp;
string str;const int fx[4] = {0,1,0,-1},fy[4] = {1,0,-1,0};
char ans[100][100];void solve()
{cin >> n >> m;getchar(); //别忘了把 n,m 之后的空格读入进来 getline(cin,s);mp[' '] = "00000";mp['a'] = "00001";mp['b'] = "00010";mp['c'] = "00011";mp['d'] = "00100";mp['e'] = "00101";mp['f'] = "00110";mp['g'] = "00111";mp['h'] = "01000";mp['i'] = "01001";mp['j'] = "01010";mp['k'] = "01011";mp['l'] = "01100";mp['m'] = "01101";mp['n'] = "01110";mp['o'] = "01111";mp['p'] = "10000";mp['q'] = "10001";mp['r'] = "10010";mp['s'] = "10011";mp['t'] = "10100";mp['u'] = "10101";mp['v'] = "10110";mp['w'] = "10111";mp['x'] = "11000";mp['y'] = "11001";mp['z'] = "11010";for (int i = 0;i < s.size();i++) str += mp[tolower(s[i])];for (int i = 0;i < 100;i++) for (int j = 0;j < 100;j++) ans[i][j] = '.';while (str.size() < n*m) str = str + '0';int x = 0,y = 0;int d = 0;for (int i = 0;i < n*m;i++){ans[x][y] = str[i];int xx = x + fx[d];int yy = y + fy[d];if (xx < 0 || xx >= n || yy < 0 || yy >= m || ans[xx][yy] != '.'){d = (d+1) % 4;xx = x + fx[d];yy = y + fy[d];}x = xx;y = yy;}for (int i = 0;i < n;i++) for (int j = 0;j < m;j++) cout << ans[i][j];
}signed main()
{int TTT;
// cin >> TTT;TTT = 1;while (TTT--) solve();return 0;
}
C. 换零钱
题目描述
喵喵现在有一堆硬币,这么多的硬币带在身上沉甸甸的,所以她不想要这么多硬币,于是乎她在想怎么在付款的时候一次性付出更多个数的硬币。这天喵喵在柜台结账的时候,她突然想到如果自己多付一些钱让老板找零,可能会让自己硬币的个数更少。老板为了更好的给客人找零,他一定会用最少的硬币数量找零给客人。
这样,喵喵开始思考该付给老板多少钱,才能在付完钱之后手里的硬币数量最少。可惜的是,喵喵在计算这方面一直不太擅长,就请你来帮助喵喵解决这个烦恼吧。
输入格式
输入一共有 3 3 3 行。
第一行表示要付的价格。
第二行有 5 5 5 个数字 p 1 , p 5 , p 10 , p 20 , p 50 p_1,p_5,p_{10},p_{20},p_{50} p1,p5,p10,p20,p50,分别是东东钱包里面一元、五元、十元、二十元和五十元硬币的个数。
第三行有 5 5 5 个数字 p 1 , p 5 , p 10 , p 20 , p 50 p_1,p_5,p_{10},p_{20},p_{50} p1,p5,p10,p20,p50,是老板所拥有的一元、五元、十元、二十元和五十元硬币的个数。
你可以假设喵喵身上的钱足够来付账,而且至少有一种付钱的方法使得老板可以找得开(如果需要找零的话)。
输出格式
在一行中输出一个正整数表示付完钱剩余的硬币个数。
样例
输入 #1
25
0 3 2 2 3
1 1 1 1 1
输出 #1
4
提示
付 3 3 3 个 5 5 5 元, 2 2 2 个 10 10 10 元, 2 2 2 个 20 20 20 元,老板找回 1 1 1 个 50 50 50 元,最后手里有 4 4 4 个硬币。
直接把所有的钱付给老板,然后让老板往回找。
#include <bits/stdc++.h>
//#define int long long
using namespace std;const int inf = 1e9;int n;
int a[10];
int b[10];const int coin[6] = {0,1,5,10,20,50};
int ans,dp[1000010];int sum; //现有的钱 void solve()
{cin >> n;for (int i = 1;i <= 5;i++) cin >> a[i],sum += a[i] * coin[i];for (int i = 1;i <= 5;i++) cin >> b[i],b[i] += a[i]; //先付钱sum -= n; //付完前后还剩 sum 元for (int i = 1;i <= sum;i++) dp[i] = inf;for (int i = 5;i >= 1;i--) //尽量取大的 {//理论上能拿到的最多的 和 老板有的int num = min(sum/coin[i],b[i]);for (int k = 1;num > 0;k *= 2){if (k > num) k = num; //取最多num -= k; //还剩的for (int j = sum;j >= coin[i] * k;j--)dp[j] = min(dp[j],dp[j-coin[i]*k]+k);}}cout << dp[sum];
}signed main()
{int TTT;
// cin >> TTT;TTT = 1;while (TTT--) solve();return 0;
}
D. 紧急排水
题目描述
由于气候变暖,许多地方都出现了历史上从未有过的大暴雨,造成了巨大的损失。为了排出各个地区的积水,国家紧急召集了有相关经验的科学家和工程师们组成了救灾小队,小队成员经过讨论后决定利用地形优势来制定排水方案。经过勘测,可以得到地表各区域的高度,如下高度表和三维图。

高度表中的数字代表高低,相邻(有边相接)的格子不会有相同的高度。为了尽快消除积水,得最大限度的利用排水设备进行作业。若一个格子有排水装备,则该格子排水所需时间为 0 0 0,没有排水装备的格子只需要等水流到有排水装备的格子,水能往相邻且较低的格子流动,流动到相邻一格的时间为 1 1 1。若某个格子的水能流到不止一个具有排水装备的格子,则让其流向最近的一个。
为了避免排水装备的不合理安置,任两个排水装备所在的格子之间的水不能流通,也就是说任何有排水装备的格子的水不可能流到另一个有装备的格子。
假设安装了 3 3 3 个排水设备在地图上,为了尽快排完所有的水,其中一种方案是装在三维图中的灰色格子上,这样各个格子所需要的排水时间下:

输入格式
第一行输入两个正整数 n , m n,m n,m 代表地图为 n × n n\times n n×n,最多安装 m m m 个排水设备。
接下来 n n n 行,每行有 n n n 个数字表示格子的高度 d d d。
- 1 ≤ n ≤ 500 , 1 ≤ m ≤ 1000 1\le n\le500,1\le m\le1000 1≤n≤500,1≤m≤1000
- 0 < d < 2 31 0<d<2^{31} 0<d<231
输出格式
在一行中输出排水所需最短时间。
若需要超过 m m m 个排水装备才能将所有格子都排水,输出 Impossible。
样例
输入 #1
3 9
3 2 3
2 1 2
3 2 3
输出 #1
2
输入 #2
4 3
5 3 2 3
4 2 1 2
5 3 2 3
4 2 3 2
输出 #2
3
输入 #3
3 1
1 2 3
2 1 2
3 2 3
输出 #3
Impossible
- 安装排水设备的个数等于坑的个数,多少个坑多少个设备,如果坑数大于 m m m 就是
Impossible - 坑是指比周围格子都低的格子
- 然后从坑往外一圈一圈的搜,取最大值就行了
#include <bits/stdc++.h>
#define int long long
using namespace std;int a[510][510];
int f[510][510];
int mx,cnt;
int n,m;const int fx[4] = {-1,0,0,1},fy[4] = {0,-1,1,0};int low(int x,int y)
{for (int i = 0;i < 4;i++){int xx = x + fx[i],yy = y + fy[i];if (xx >= 0 && xx < n && yy >= 0 && yy < n && a[x][y] > a[xx][yy])return 0;}return 1;
}struct node {int x,y,d;};
queue <node> q;void bfs()
{while (!q.empty()){int x = q.front().x,y = q.front().y,d = q.front().d;q.pop();for (int i = 0;i < 4;i++){int xx = x + fx[i],yy = y + fy[i];if (xx >= 0 && xx < n && yy >= 0 && yy < n && !f[xx][yy] && a[x][y] < a[xx][yy]){q.push({xx,yy,d+1});f[xx][yy] = 1;mx = max(mx,d+1);}}}
}void solve()
{cin >> n >> m;for (int i = 0;i < n;i++)for (int j = 0;j < n;j++)cin >> a[i][j];for (int i = 0;i < n;i++)for (int j = 0;j < n;j++)if (low(i,j))cnt++,f[i][j] = 1,q.push({i,j,0}); //坑if (cnt > m) cout << "Impossible";else bfs(),cout << mx;
}signed main()
{int TTT = 1;
// cin >> TTT;while (TTT--) solve();return 0;
}
E. 倒酒
题目描述
喵喵是一个商人,主营业务是卖酒,做生意初期,一切以节省开支为第一要务,所以她除了装酒的大桶外只买了两个杯子,这两个杯子除了标注了装满时是装了多少,并没有其它刻度。
每当有客人光顾的时候,客人会告诉喵喵他想要买多少酒。虽然没有正常的容器,但是聪明的喵喵会利用这两个杯子的差异,经过若干次倒空与注满的操作,准确的凑出客人所需要的量。
经过多日经营,喵喵也发现了一个问题,有些客人的需求,喵喵是无论如何也凑不出来的,这个时候她就会提议让客人多买一点或者少买一点到恰好能凑出的量。
每次到最后才发现凑不出来所需要的量真的是让喵喵有点头疼,所以喵喵求助于你让你能不能最开始的时候就判断出客人的量能不能被准确凑出。
输入格式
多组输入。
每组输入给出三个不超过 100 100 100 的正整数 x , y , z x,y,z x,y,z,分别表示喵喵的两个杯子和客人需要的量。
一行中 0 0 0 的时候表示输入结束。
输出格式
对每组测试资料,你应该输出一行。如果客人要求的量凑得出来,请输出 Yes,否则请输出 No。
样例 #1
样例输入 #1
1 2 1
1 2 9
3 5 4
3 6 8
0 0 0
样例输出 #1
Yes
Yes
Yes
No
- 两个杯子的容量 x , y x,y x,y,假设 x > y x>y x>y,那我们相当于是有抽象的杯子 k 1 × ( x − y ) k_1\times(x-y) k1×(x−y),也有抽象的杯子 k 2 × y − x k_2\times y-x k2×y−x, k 1 , k 2 k_1,k_2 k1,k2 都是任意常数
- 所以题目相当于是求 k 1 × ( x − y ) + k 2 × y − x = z k_1\times(x-y)+k_2\times y-x=z k1×(x−y)+k2×y−x=z 的解
- 合并可得 k 3 × x − k 4 × y = z k_3\times x-k_4\times y=z k3×x−k4×y=z, k 3 , k 4 k_3,k_4 k3,k4 是任意常数
- 上面这个方程有解的条件就是 z m o d gcd ( x , y ) = 0 z\bmod\gcd(x,y)=0 zmodgcd(x,y)=0
#include <bits/stdc++.h>
#define int long long
using namespace std;void solve()
{int a,b,c;while (cin >> a >> b >> c){if (a + b + c == 0) return ;if (c % __gcd(a,b) == 0) cout << "Yes\n";else cout << "No\n";}
}signed main()
{solve();return 0;
}
相关文章:
C++学习笔记3
A. 求出那个数 题目描述 喵喵是一个爱睡懒觉的姑娘,所以每天早上喵喵的妈妈都花费很大的力气才能把喵喵叫起来去上学。 在放学的路上,喵喵看到有一家店在打折卖闹钟,她就准备买个闹钟回家叫自己早晨起床,以便不让妈妈这么的辛苦…...
基于SpringBoot的酒店(预约)客房管理系统的设计与实现+毕业论文
系统介绍 酒店客房管理系统为酒店管理者和用户、清洁人员提供一个在线管理酒店客房的系统。在网站的设计中,一共分为了两个模块设计,一个是前台模块,一个是后台模块,前台主要用于提供查看客房信息,酒店资讯࿰…...
Rust 中的声明可见性
Rust 中的声明可见性 在 Rust 编程语言中,声明可见性是一个核心概念,它决定了代码中的项(如函数、结构体、枚举等)在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性,以确保代码的安全性和封装性。下…...
让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】
目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识,将数学表达式的整个计算过程,以及计算繁多结果在 Java 中绘制出来,计算机中的数学表达式计算的功能很常见了&a…...
Django——中间件
Django——中间件 中间件可以介入 Django 的请求和响应的处理过程,修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式,增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...
景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
随着无人机技术的不断发展与革新,它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防:边境管理部门利用无人机监控边境线,防止非法越境和其他安全威胁,同时也能监控地面安保人员的工作状态和行动路线。 …...
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...
[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)
一、前言 在学习 C 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深…...
vue中怎样清除computed的缓存
vue中computed计算属性自带缓存,会提高程序的渲染性能,但根据业务需求以及相应的优化,可能要清除computed的缓存,具体方法和场景分为了vue2和vue3 vue2: this.$delete(this.someObject, cachedProperty); 使用 this…...
代码大师的工具箱:现代软件开发利器
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
整理好了!2024年最常见 100 道 Java基础面试题(四十三)
上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(四十二)-CSDN博客 八十五、Java 常用的元注解有哪些? 在Java中,元注解(Meta-Annotation)是指那些用于其他注解上的注解&…...
【TypeScript模块简介以及使用方法】
TypeScript模块简介 TypeScript中的模块(Modules)是代码的封装体,它们可以包含变量、函数、类和接口等。在TypeScript中,模块可以被其他模块引用和使用,从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…...
Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)
目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划(超时…...
java8 转对象,Java8转Map,Java8转Llist
1.准备数据 public static List<Persion> getData(){List<Persion> arrayList new ArrayList<>();arrayList.add(new Persion("李四","20","男"));arrayList.add(new Persion("王麻子","30","男&q…...
【Pytest官方文档翻译及学习】2.1 如何调用pytest
目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…...
RabbitMQ的用途
RabbitMQ主要有四个用途,分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下: RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦:提高系统容错性和可维护性 2.异步提速:提升用户体验…...
R语言软件安装及配置
1、下载 网址:www.r-project.org 1.1 下载R 选择download R 选择清华源进行下载 根据自己系统情况下载,我选择windows系统。 先选择base。 选择最新的版本下载。 1.2 下载RTools 下载好后,返回,选择RTools进入后,选…...
网络配置的加密存储
随着数据泄露事件的增加,扰乱了公司的正常工作周期,企业遭受了损失。事实上,数据泄露可以通过存储加密来控制,存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中,存储加密可用于存储设…...
你写代码,会关注时间复杂度吗?
虽然面试的时候总是被问到这个问题,但你写代码的时候,真的会想到这个问题吗?时间复杂度,说的当然不是你写的代码执行用了多长时间,而是代码执行语句的次数。 目录 每行代码都需要注意 计算方法 1 例如常量增长 2 …...
【连连国际注册/登录安全分析报告】
连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
