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

相关推荐
拾忆-eleven1 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法
Hxyle1 小时前
c++设计模式
开发语言·c++·设计模式
吸纹鸽2 小时前
蓝桥杯FPGA赛道第二次模拟题代码
fpga开发·蓝桥杯
神仙别闹2 小时前
基于QT(C++)实现(图形界面)校园导览系统
数据库·c++·qt
明月看潮生2 小时前
青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法
c++·图像处理·算法·青少年编程·编程与数学
我是一只鱼02233 小时前
LeetCode算法题 (反转链表)Day17!!!C/C++
数据结构·c++·算法·leetcode·链表
菜鸟破茧计划3 小时前
C++ 算法学习之旅:从入门到精通的秘籍
c++·学习·算法
喜欢吃燃面3 小时前
C++:扫雷游戏
c语言·c++·学习
海木漄3 小时前
关于点胶机的精度
c++·点胶机
yunbao00_4 小时前
C++ 复习(一)
开发语言·c++