蓝桥真题讲解
本篇文章继续给大家讲解蓝桥真题
第一题
题目链接
0封闭图形个数 - 蓝桥云课
题目解析
代码原理
代码编写
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll max_len = 200010;
struct node
{
ll val;
ll zero;
}a[max_len];
bool compare(node a, node b)
{
if(a.zero != b.zero)
{
return a.zero < b.zero;
}
return a.val < b.val;
}
int main()
{
// 请在此输入您的代码
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
map<int,int> mp;
mp[0] = mp[4] = mp[6] = mp[9] = 1, mp[8] = 2, mp[1] = mp[3] = mp[5] = mp[7] = mp[2] = 0;
ll n = 0;
cin >> n;
for(ll i = 1; i <= n; i++)
{
cin >> a[i].val;
}
for(ll i = 1; i <= n; i++)
{
ll x = a[i].val, sum = 0;
while(x)
{
sum += mp[x % 10];
x /= 10;
}
a[i].zero = sum;
}
sort(a + 1, a + 1 + n, compare);
for(ll i = 1; i <= n; i++)
{
cout << a[i].val << " ";
}
return 0;
}
本题总结
思路梳理:1.从题目中获取并列举出条件2.根据给出的例子去理解题目意思
代码总结:结构体代码思维、排序容器sort、容器map的创建与使用
第二题
题目链接
0回文数组 - 蓝桥云课
题目解析
代码原理
代码编写
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll max_len = 100010;
ll a[max_len];
ll dif[max_len];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n = 0;
ll ret = 0;
cin >> n;
for(ll i = 1; i <= n; i++)
{
cin >> a[i];
}
for(ll i = 1; i <= n / 2; i++)
{
dif[i] = a[i] - a[n - i + 1];
}
for(ll i = 1; i <= n / 2; i++)
{
ret += abs(dif[i]);
if(dif[i] < 0 && dif[i + 1] < 0) dif[i + 1] -= max(dif[i], dif[i + 1]);
else if(dif[i] > 0 && dif[i + 1] > 0) dif[i + 1] -= min(dif[i], dif[i + 1]);
}
cout << ret;
return 0;
}
本题总结
知识点:abs()函数是取绝对值
思路梳理:先读题,提取出题目条件后,进行画图,分情况讨论:分别是由大往小变和由小往大变
贪心策略:能一起加的时候绝不单独加
第三题
题目链接
0求和 - 蓝桥云课
题目解析
代码原理
因为这个数会很大,有可能超过int甚至是long long,普通的循环有可能行不通,因此我们要用上高中学的知识等差数列求和公式
公式:(首项 + 尾项)* 项数 / 2
由于这题的代码很简单相信各位小伙伴都是有实力的,因此博主也就不展示代码了。若真有问题,呃,私信我好吧。
本题总结
公式:(首项 + 尾项)* 项数 / 2
本篇文章的内容就先到这里,我们下期文章再见!