蓝桥杯第十六届c组c++题目及个人理解

本篇文章只是部分题目的理解,代码和思路仅供参考,切勿当成正确答案,欢迎各位小伙伴在评论区与博主交流!

题目:2025

题目解析

核心提取

要求的数中至少有1个0、2个2、1个5

代码展示

cpp 复制代码
#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

代码展示

cpp 复制代码
#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个瓶子的水增加

代码展示

cpp 复制代码
#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个,且每一组最多只能有三个数

代码原理

红色框所框住的是重点

代码展示

cpp 复制代码
#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;
 } 

当然还是那句话本段代码可能存在一些缺陷,所以代码和思路仅供参考,如果有新的思路或者代码上有新的缺陷,欢迎在评论区留言

题目 :最短距离

题目解析

首先我们先来讲一下这个示例

示例解析

代码原理

这题的代码原理与三国游戏的原理比较类似,总之也是贪心

代码展示

cpp 复制代码
#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本篇文章的分享就到这里,至此蓝桥杯系列的文章完结,当然有需要的小伙伴可以留言,博主看到有小伙伴要求依旧会更新。

相关推荐
会编程的小孩6 小时前
C++ qt的安装
c++
小成2023032026511 小时前
C++~07补充
开发语言·c++
hold?fish:palm11 小时前
40 二叉树的直径
c++·leetcode
解决小子12 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
lunar_coder13 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯14 小时前
C++进阶.多态
c++
凯瑟琳.奥古斯特15 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun6115 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖15 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
qz_Serene16 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节