题目描述
在XX的徒弟中,每一名徒弟都有一个能力值。现在XX想挑选一个两人小组,他有个奇怪的要求,
需要这两名徒弟的能力值加起来和XX一个期望的值一样,现在请你帮忙计算他有多少种挑选徒弟组成小组的方式,注意不同徒弟能力值可能相同。
输入
第一行一个整数n(2<=n<=100000)和一个整数t(1<=t<=100000), 表示XX徒弟的个数和他期望的值,
接下来一行有n个非负整数,第i个非负整数表示第i名徒弟的能力值,其中每名徒弟的能力值都不会超过t。
输出
输出一行,表示XX能挑选出一个2人小组的方案数
样例输入
4 5
2 3 3 2
样例输出
4
提示
样例解释:
可以选择的方式有(1,2),(1,3),(2,4),(3,4)共四种
C语言代码如下
#include<stdio.h>
long long arr[101000] = { 0 };//初始化为0,定义longlong很重要
int main()
{
int t,i,num= 0, m = 0, max = 0, min = 0;
long long sum = 0;//sum可能会很大
scanf_s("%d %d %d", &num,&t,&m);
arr[m]++;
min = m;
max = m;//取最大和最小数,便于减少不必要的循环
for (i = 1; i <num; i++)
{
scanf_s("%d", &m);
if (m >= 0)
{
arr[m]++;
if (m > max)
{
max = m;
}
if (m < min)
{
min = m;
}
}
}
for (int i = min; i <= max; i++)
{
for (int j = i; j <= max; j++)
{
if (i + j == t)
{
if (i==j)
{
sum=sum+(arr[i])*(arr[j] - 1) / 2;
}
else
{
sum=sum+arr[i] * arr[j];
}
}
}
}
printf("%lld\n", sum);
return 0;
}