蓝桥杯冲冲冲~
回顾 🔖蓝桥杯每日练习(巧排扑克牌,质数拆分,日志统计,递增三元组,外卖店优先级)
🔖蓝桥杯每日练习(猴子分香蕉,等差数列,平方序列,倍数问题)
🔖蓝桥杯每日练习(纯质数(筛法的应用),最少砝码,灌溉)
🔖蓝桥杯每日练习(相乘,空间,发现环)
🚶引言
今天继续蓝桥杯每日练习~ 今天的题目相对简单,可以巩固一下基础算法。今天得题目没有用到什么数据结构与算法,可以说都是思维题,快到比赛了锻炼一下思维也是不错的~我是学习算法的小菜鸡,每天一个小知识点,我们国赛见~
🚀今日题目
💓神奇算式
题目描述
由 4 个不同的数字,组成的一个乘法算式,它们的乘积仍然由这 4 个数字组成。
比如:
210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187 都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的 3 种情况,一共有多少种满足要求的算式。 原题传送门
解题报告
就是一道模拟题,根据题意模拟就可以了。先dfs一个10的全排列(取前四位)然后用他们组合数字(遍历一下前两个乘数的位数)然后乘起来一位一位判断就可以了
参考代码(C++版本)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 15;
int st[N], num;
int ans;
vector<int>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<int>h;
if (t != 4) goto l;
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;
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 符合,说明正确的可能性很大!!(不能排除错误) 请你写一个计算机程序,对给定的字符串逐位求和。 原题传送门
🌴解题报告
先请各位自己找一下规律 我们惊喜的发现一组9个数,而且答案就是对9取余。如果余数为0,那么答案应该是9。
🌵参考代码(C++版本)
#include<iostream>
#include<string>
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++版本)
#include <iostream>
using 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;
}
|