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

发布于:2025-05-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

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

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


网站公告

今日签到

点亮在社区的每一天
去签到