【蓝桥杯】蓝桥杯第十届C++b组刷题总结

目录

      • A、组队
      • D、数的分解
      • H、等差数列
      • G、完全二叉树的权值

A、组队

一个人怎么能同时担任两个角色呢??!!!
我以为你是来送分的,结果你是来夺命的!!蓝桥杯你没有心呜呜呜。

D、数的分解

【蓝桥杯】蓝桥杯第十届C++b组刷题总结_第1张图片

好简单的枚举题呜呜呜。
但是我没有考虑到 i 和 j 是不能相同的。
很残酷,这是填空题,错了就是一分没有。
你要细心,细心呀

#include
#include
#include
#include
using namespace std;

int ans;
bool check(int x)
{
	while(x)
	{
		if(x%10 == 2 || x%10 == 4)
			return false;
		x /= 10;
	}
	return true;
}

int main(void)
{
	int n = 2019;
	for(int i = 1; i <= n/3; i++)
	{
		// int j = i; 
		for(int j = i+1; j <= n-1; j++)  //我忘了i,j应也是不同的。 
		{
			if(n-i-j <= j)
				continue;
			if(check(i) && check(j) && check(n-i-j))
				ans ++;
		}
	}
	cout<< ans << endl;
	return 0;
}

H、等差数列

【蓝桥杯】蓝桥杯第十届C++b组刷题总结_第2张图片
【蓝桥杯】蓝桥杯第十届C++b组刷题总结_第3张图片

题目不难,简单数学题~
数学题要注意分类讨论。
我的错误代码~有点脑子但不多

#include
#include
#include
#include
using namespace std;

const int N = 1e5 + 10;
int a[N];

int gcd(int a, int b)
{
	return b ? gcd(b, a%b) : a;
}
int main(void)
{
	int n; 
	cin>> n;
	for(int i = 1; i <= n; i++)
		cin>> a[i];
	sort(a+1, a+n+1);
	int G = a[1];  //错啦
	
	for(int i = 2; i <= n; i++)
	{
		G = gcd(G, a[i-1]); //error
	}
	int res = 1;
	for(int i = 2; i <= n; i++)
		res += ( a[i] - a[i-1] ) / G; 
	cout<< res << endl;
	return 0;
}
//1 + 1 + 1 + 2 + 5
// 2 4 6 10 20

正确代码:

#include
#include
#include
#include
using namespace std;

const int N = 1e5 + 10;
int a[N];

int gcd(int a, int b)
{
	return b ? gcd(b, a%b) : a;
}
int main(void)
{
	int n; 
	cin>> n;
	for(int i = 1; i <= n; i++)
		cin>> a[i];
	sort(a+1, a+n+1);
	int G = a[2] - a[1];
	
	for(int i = 2; i <= n; i++)
	{
		G = gcd(G, a[i] - a[i-1]);
	}
	if(a[n] - a[1] == 0)
		cout<< n << endl;
	else
		cout<< (a[n] - a[1])/G + 1 << endl;
	return 0;
}

1、一定要好好背背求gcd的代码。
2、该拿分的题一定要小心,过了样例不代表思路是正确的。还是要动脑子。
这道题我的错误那里本来是抱着试一试的心态写的(凭感觉),刚好过了样例。就直接不管它写下一题了。我的思路还是错的。

G、完全二叉树的权值

【蓝桥杯】蓝桥杯第十届C++b组刷题总结_第4张图片
【蓝桥杯】蓝桥杯第十届C++b组刷题总结_第5张图片
注意:

1、注意sum, Max可能很大,要开long long
2、题目可能有负数,注意Max初始化为-1e18
3、完全二叉树最后一层可以不是满的,加一个特判 j <= n
4、是有双指针的思想在里面的

AC代码:

#include
#include
#include
using namespace std;

typedef long long LL;
const int N = 1e5+10;
int n;
int a[N];

int main(void)
{
	cin>> n;
	for(int i = 1; i <= n; i++)
		cin>> a[i];
	LL Max = -1e18;
	LL shendu = 0, x;
	for(int i = 1; i <= n; )  // i表示当前层有 i个元素 
	{
		shendu ++;
		LL sum = 0;
		for(int j = i; j < 2*i && j <= n ; j++) // 当前层有 i个元素的话,j的坐标也应该从 i 开始 
			sum += a[j]; //当前层的所有数之和 
		if(sum > Max)
		{
			x = shendu; //更新答案的深度 
			Max = sum;
		}
		i = i*2;
	}
	cout<< x << endl;
	return 0;
}

祝大家学习进步,天天快乐AC。
遇见蓝桥遇见卿,不负代码不负自己。祝我们取得好成绩~

你可能感兴趣的:(蓝桥杯,c++,蓝桥杯,算法)