蓝桥杯 (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;
}
相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’4 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Swift社区6 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman7 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Yang.997 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王7 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_7 小时前
C++自己写类 和 运算符重载函数
c++