XX组队

题目描述

在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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值