蓝桥杯 (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;
}
相关推荐
地平线开发者2 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
快乐的划水a2 小时前
组合模式及优化
c++·设计模式·组合模式
地平线开发者2 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟6 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀6 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1126 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧6 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
阿巴~阿巴~6 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list