P8196 [传智杯 #4 决赛] 三元组

195 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

[传智杯 #4 决赛] 三元组

题目描述

给定一个长度为 nn 的数列 aa,对于一个有序整数三元组 (i,j,k)(i, j, k),若其满足 1ijkn1 \leq i \leq j \leq k \leq n 并且 ai+aj=aka_i +a_j = a_k,则我们称这个三元组是「传智的」。

现在请你计算,有多少有序整数三元组是传智的。

输入格式

本题单测试点内有多组测试数据

输入的第一行是一个整数 TT,表示数据组数。

对于每组数据:

第一行是一个整数,表示数列的长度 nn
第二行有 nn 个整数,第 ii 个整数表示 aia_i

输出格式

对于每组数据,输出一行一个整数表示答案。

样例 #1

样例输入 #1

2
3
1 2 3
5
1 2 3 4 5

样例输出 #1

2
6

提示

样例 1 解释

对于第一组数据,因为 a1+a1=a2a_1 + a_1 = a_2a1+a2=a3a_1 + a_2 = a_3,故共 (1,1,2)(1, 1, 2)(1,2,3)(1, 2, 3) 两个三元组。
对于第二组数据六个三元组分别是:

  • (1,1,2)(1, 1, 2)
  • (1,2,3)(1, 2, 3)
  • (1,3,4)(1, 3, 4)
  • (1,4,5)(1, 4, 5)
  • (2,2,4)(2, 2, 4)
  • (2,3,5)(2, 3, 5)

数据规模与约定

对于全部测试点,保证 1T1001 \leq T \leq 1001n,ai1001 \leq n , a_i \leq 100,且各个测试点的 nn 之和不超过 100100,即 n100\sum n \leq 100

思路分析

  • 刚开始看到这道题,感觉就是题目很好理解,但是不是特别好下手
  • 但是看到测试数据(组数)仅仅只有100,而且数组最多就只需要开100,也就是说暴力枚举的话,粗略计算只有十的八次方,而且三维循环并不是是的六次方,是一个三角形的,也就是说是2乘十的五次方,总的来说直接暴力结束
  • 在全局变量开个105的数组即可
  • 每次三维循环前有一个重新赋零值的sum来做计数器

代码展示

#include<iostream>
using namespace std;
int a[105];

int main()
{
	int t;//组数
	cin >> t;

	while (t--) {
		int n;
		cin >> n;
		//存储数据
		for (int i = 1; i <= n; i++)cin >> a[i];
		int sum = 0;
		//暴力枚举
		for (int i = 1; i <= n; i++) {
			for (int j = i; j <= n; j++) {
				for (int k = j; k <= n; k++) {
					if (a[i] + a[j] == a[k])
						sum++;
				}
			}
		}
		cout << sum << endl;
	}
}

结果

image.png PS:这只是第四题,难度其实还是没上来,在洛谷评级仅仅是入门~