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;
}


你可能感兴趣的:(XDOJ1138 - 祯爷的苹果)