XDOJ1138 - 祯爷的苹果

Description

  有一天,祯爷得到一堆苹果,每个苹果有一个体积ai,他想从中任取两个吃掉,并且刚好填饱肚子,祯爷想知道一共有多少种取法。

Input

第一行:一个整数C(C<=10),表示测试数据组数。
每组测试数据:
   第一行:n,m分别表示苹果数量和祯爷的肚子容量。
   接下来n行,每行一个整数ai,表示苹果体积。
   0 < n <= 100000, 0 <= m <= 1000000000, -1000000000 <= ai <= 1000000000

Output

方案总数。

Sample Input

2
2 5
1 4
3 10
5 5 5

Sample Output

1
3

Hint

  苹果体积有负值。 

解题思路:

如果用枚举的方式肯定会TLE,这里用到字典的方式进行处理。

map[v] = v的个数t

那么如果v1+v1=m,那么方法数为C(t1,2) = t1*(t1-1)/2

如果v1+v2 = m,那么方法数为t1*t2/2

 

#include<iostream>
#include<map>
using namespace std;
map<int,int> apple;
map<int,int>::iterator iter;
int main()
{
    int C;
    cin>>C;
    for(int caseN=0;caseN<C;++caseN)
    {
        int n,m;
        cin>>n>>m;
        apple.clear();
        for(int i=0;i<n;++i)
        {
            int t;
            cin>>t;
            apple[t]++;
        }
        long long ways = 0;
        iter = apple.begin();
        for(;iter!=apple.end();++iter)
        {
            if(m-iter->first==iter->first)
                ways += (long long)iter->second*(iter->second-1);
            else
                ways += (long long)iter->second*apple[m-iter->first];
        }
        cout<<ways/2<<endl;
    }
    return 0;
}

 

最后欢迎大家访问我的个人网站: 1024s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值