蓝桥杯第十六届c组c++题目及个人理解
本篇文章只是部分题目的理解,代码和思路仅供参考,切勿当成正确答案,欢迎各位小伙伴在评论区与博主交流!
题目:2025
题目解析
核心提取
要求的数中至少有1个0、2个2、1个5
代码展示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool judge(int n)
{int x = n;int nums_2 = 0, nums_0 = 0, nums_5 = 0; while(x){int tmp = x % 10;if(tmp == 2) nums_2++;if(tmp == 0) nums_0++;if(tmp == 5) nums_5++;x /= 10;}if(nums_2 == 2 && nums_0 == 1 && nums_5 == 1) return true;else return false;
}
int main()
{int cnt = 0; for(int i = 1; i <= 20250412; i++){if(judge(i))//为真{cnt++;//计数器 + 1 }}cout << cnt;return 0;}
题目:数位倍数
题目解析
核心提取
数位之和%5为0
代码展示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool judge(int n)
{int x = n;int sum_shuwei = 0;while(x){int tmp = x % 10;sum_shuwei += tmp;x /= 10;}if(sum_shuwei % 5 == 0) return true;else return false;
}
int main()
{int cnt = 0; for(int i = 1; i <= 202504; i++){if(judge(i))//为真{cnt++;//计数器 + 1 }}cout << cnt;return 0;}
题目:倒水
题目解析
核心提取
第i个瓶子与第i + k个瓶子内水的颜色相同
第i个瓶子和第j(i + k)个瓶子内的水满足要求i < j
代码原理
这里的代码原理主要是凑,满足i<j才能结束凑
注意:减表示第i个瓶子内的水倒出 加表示第i + k个瓶子的水增加
代码展示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
int a[N];
int main()
{int n = 0, k = 0;cin >> n >> k;for(int i = 1; i <= n; i++){cin >> a[i];}for(int i = 1; i <= n / 2; i++){for(int j = i + k; j <= n; j++){while(a[i] > a[j]){a[i]--;a[j]++;}}}int min_val = 0x3f3f3f3f;for(int i = 1; i <= n; i++){min_val = min(min_val, a[i]);}cout << min_val;return 0;}
个人理解
本段代码可能存在一定的缺陷,当时在比赛中也想不出啥好的思路,于是就分析了一下这个例子,于是就发现可以凑,反正时间复杂度肯定超时,有新思路的小伙伴欢迎在评论区与博主分享
题目:拼好数
题目解析
核心提取
好数的定义:6的个数≥6个,且每一组最多只能有三个数
代码原理
红色框所框住的是重点
代码展示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
struct Node
{string val;int val_6_nums;//统计6的个数
}a[N];
int jisuan(string n)//统计6的个数
{string x = n;int nums_6 = 0;for(int i = 0; i < n.size(); i++){if(n[i] == '6') nums_6++;}return nums_6;
}
bool cmp(Node a, Node b)
{if(a.val_6_nums != b.val_6_nums)return a.val_6_nums > b.val_6_nums;else return a.val > b.val;
}
int main()
{int n = 0;cin >> n;for(int i = 1; i <= n; i++){cin >> a[i].val;}for(int i = 1; i <= n; i++){a[i].val_6_nums = jisuan(a[i].val);//先统计每个字符串的中6的个数 }sort(a + 1, a + 1 + n, cmp);//排序,贪心的体现 int ret = 0;int i = 1;int tm = 0;while(i <= n){if(a[i].val_6_nums >= 6) {ret++;i++;}else if(a[i].val_6_nums < 6){a[i + 1].val += a[i].val;//拼接字符串 a[i + 1].val_6_nums = jisuan(a[i + 1].val);//更新6的个数 if(tm == 3)break;tm++; }i++;}cout << ret;return 0;}
当然还是那句话本段代码可能存在一些缺陷,所以代码和思路仅供参考,如果有新的思路或者代码上有新的缺陷,欢迎在评论区留言
题目 :最短距离
题目解析
首先我们先来讲一下这个示例
示例解析
代码原理
这题的代码原理与三国游戏的原理比较类似,总之也是贪心
代码展示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 50010;
int a[N], b[N];
int main()
{int n = 0;cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i <= n; i++) cin >> b[i];sort(a + 1, a + 1 + n);//排序,贪心的体现 sort(b + 1, b + 1 + n);int ret = 0;for(int i = 1; i <= n; i++){ret += abs(a[i] - b[i]);}cout << ret;return 0;}
ok本篇文章的分享就到这里,至此蓝桥杯系列的文章完结,当然有需要的小伙伴可以留言,博主看到有小伙伴要求依旧会更新。