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