引言 今日题目
神奇算式
题目描述解题报告参考代码(C++版本) 缩位求和
题目描述解题报告参考代码(C++版本) 积木大赛
题目描述解题报告参考代码(C++版本)
蓝桥杯冲冲冲~
回顾
蓝桥杯每日练习(巧排扑克牌,质数拆分,日志统计,递增三元组,外卖店优先级)
蓝桥杯每日练习(猴子分香蕉,等差数列,平方序列,倍数问题)
蓝桥杯每日练习(纯质数(筛法的应用),最少砝码,灌溉)
蓝桥杯每日练习(相乘,空间,发现环)
引言
今日题目 神奇算式 题目描述今天继续蓝桥杯每日练习~ 今天的题目相对简单,可以巩固一下基础算法。今天得题目没有用到什么数据结构与算法,可以说都是思维题,快到比赛了锻炼一下思维也是不错的~我是学习算法的小菜鸡,每天一个小知识点,我们国赛见~
由 4 个不同的数字,组成的一个乘法算式,它们的乘积仍然由这 4 个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的 3 种情况,一共有多少种满足要求的算式。
原题传送门
参考代码(C++版本)就是一道模拟题,根据题意模拟就可以了。先dfs一个10的全排列(取前四位)然后用他们组合数字(遍历一下前两个乘数的位数)然后乘起来一位一位判断就可以了
//本人菜鸡一个,代码又臭又长(主要是写前没想)太丢人了啊啊啊~ #include缩位求和 题目描述#include #include using namespace std; const int N = 15; int st[N], num; int ans; vector res; void check() { int flag = 10; for (int i = 0; i < 3; i++) { int a = num / flag, b = num % flag, c = a * b; int t = 0; while (a) { t++; a /= 10; } while (b) { t++; b /= 10; } int ok = 1, cnt = 0; vector h; if (t != 4) goto l; //如果乘数和不是4位,换言某一个数最高位0被省略了 while (c) { cnt++; if (!st[c % 10]) ok = 0; h.push_back(c % 10); c /= 10; } sort(h.begin(), h.end()); for (int i = 1; i < h.size(); i++) if (h[i] == h[i - 1]) ok = 0; if (ok && cnt == 4) ans++; l: flag *= 10; } } void dfs(int k) { if (k == 4) { check(); return; } for (int i = 0; i <= 9; i++) { if (k == 0 && i == 0) continue; //最高位不能是0 if (!st[i]) { st[i] = 1; num = num * 10 + i; dfs(k + 1); num /= 10; st[i] = 0; } } } int main() { dfs(0); cout << ans / 2 << endl; //满足交换律的两种情况 return 0; }
在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。
比如:248×15=3720
把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得2 + 4 + 8 = 14 ==> 1 + 4 = 5
1 + 5 = 6
5×6=3
而结果逐位求和为 3。
5×6 的结果逐位求和与 3 符合,说明正确的可能性很大!!(不能排除错误)
请你写一个计算机程序,对给定的字符串逐位求和。
原题传送门
| 打眼儿一看这不就是五行代码的事吗 |
参考代码(C++版本)先请各位自己找一下规律
我们惊喜的发现一组9个数,而且答案就是对9取余。如果余数为0,那么答案应该是9。
#include积木大赛 题目描述#include using namespace std; string res; int main() { cin >> res; int num = 0; for (int i = 0; i < (int)res.size(); i++) num += res[i] - '0'; if (!(num % 9)) cout << 9; else cout << num % 9; }
春春幼儿园举办了一年一度的"积木大赛"。今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为 1 的积木组成,第 i 块积木的最终高度需要是 h[i]。
在搭建开始之前,没有任何积木(可以看成 n 块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间 [L,R],然后将第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加 1。
小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。
原题传送门
| 打眼儿一看这不就是五行代码的事吗 |
我们读完题后可以发现,前一个的高度一定是能给后一个用的(因为每次操作的宽度不限)所以我们可以利用这一特点,构造一个类似差分数组的东西。
参考代码(C++版本)也可以发现一个高的的高度一定能给他周围的用,所以波峰才会被用到(如果一个数在一个范围内他左边的数单调递增右边的数单调递减,那么称他为一个波峰)所以对波峰求和然后特判也可以做
#includeusing namespace std; const int N = 1e5 + 10; int q[N],n, ans; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> q[i]; for (int i = 1; i <= n; i++) ans += max(q[i] - q[i - 1], 0); cout << ans << endl; return 0; }



