蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录

1、求和

题目:

思路:

代码:

2、等差数列

题目:

思路:

代码:

3、顺子日期

题目:

思路:

代码:

4、灌溉

题目:

代码:



1、求和

题目:

思路:

1、首先想到的是两重遍历,累加和。但是当n取200000时,会超时,所以暴力的遍历没有办法通过全部案例。

2、将公式变形得到S=a1*(a2+....+an)+a2*(a3+....+an)+.....+an.

3、所以先求所有项的累加和sum,从第一项开始每次将sum减去一项自身ai乘以自身ai,再将这些和相加得到结果。

代码:

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
	int n,a[200010];
	cin >> n;
	long long sum = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	long long ans = 0;
	for (int i = 0; i < n; i++)
	{
		sum -= a[i];
		ans += a[i] * sum;
	}
	cout << ans;
}

2、等差数列

题目:

思路:

1、求等差数列,一开始想到直接找它们的最小差作为公差,但实际上是不行的,这可能没有办法构成等差数列。(比如:15、5、1这三个数,如果取5-1的差4为公差,会发现1、5、9、13、17,15不在等差数列中,所以不可取。)

2、通过上面的例子我们可以发现,我们要求的公差是可以满足一个数可以等于从另一个数加公差的倍数。所以我们要求的公差,是将所有数从小到大排序,所有相邻两数差的最大公约数。(比如:1、5、15,差有4、10,它们的最大公约数为2,所以公差为2,构成1、3、5、7、9、11、13、15的等差数列。)

3、最后得到公差,个数即位最大的数减去最小的数/公差+1;有一种情况比较特殊,当公差为0,即每个数都相等的时候,个数即为n。

代码:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
long long gcd(int a, int b)//辗转相除,求最大公约数
{
	if (b == 0)
		return a;
	else
		return gcd(b, a % b);
}
int main()
{
	int n;
	cin >> n;
	long long a[100010];
	for (int i = 0; i < n; i++)
		cin >> a[i];
	sort(a, a + n);
	long long d = a[1] - a[0];
	for (int i = 2; i < n; i++)
	{
		d = gcd(d, a[i] - a[i - 1]);
	}
	if (a[n - 1] == a[0])
		cout << n;
	else
		cout << ((a[n - 1] - a[0]) / d )+ 1;
}

3、顺子日期

题目:

思路:

1、判断每一天是否存在顺子序列:012、123、234.......,只要存在一个顺子序列即为顺子日期。

代码:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
int judge(int t[])
{
	int flag = 0;
	for (int i = 3; i <= 5; i++)
	{
		if (t[i] == (t[i + 1] - 1) && (t[i + 1] == t[i + 2] - 1))
		{
			flag = 1;
			break;
		}
	}
	return flag;
}
int main()
{
	int day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int t[8] = { 2,0,2,2 },ans = 0;
	for (int i = 1; i <= 12; i++)
	{
		t[4] = i / 10;
		t[5] = i % 10;
		for (int j = 1; j <= day[i]; j++)
		{
			t[6] = j / 10;
			t[7] = j % 10;
			if (judge(t))
			{
				ans++;
				//for (int i = 0; i < 8; i++)
					//cout << t[i];
				//cout << endl;
			}
		}
	}
	cout << ans;
}

4、灌溉

题目:

代码:

cpp 复制代码
#include<iostream>
#include<cmath>
using namespace std;
int n, m, t, r[110], c[110];
int main()
{
    cin >> n >> m >> t;
    for (int i = 1; i <= t; i++)
        cin >> r[i] >> c[i];
    int k;
    cin >> k;
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            for (int l = 1; l <= t; l++)
            {
                int d = abs(r[l] - i) + abs(c[l] - j);
                if (d <= k)
                {
                    cnt++;
                    break;
                }
            }
        }
    }
    cout << cnt << endl;
}
相关推荐
程序员-King.6 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
优雅的潮叭6 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计7 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
月挽清风7 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室7 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队8 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称8 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch8 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
点云SLAM8 小时前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
浅念-9 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法