原题链接
太太书记每周都去小学给孩子们教编程,孩子们大多对编程提不起兴趣,所以他就给每个孩子两颗糖。他有n个重为a1,a2,a3,…,an的糖果,他没有任意两块一样大的糖。多年的经验告诉他,孩子们假如分到不同重量的糖,就会不高兴,然后不学习。他不想让任何人不高兴,显然,假如他给某个孩子的糖的重量和别的孩子不一样,他就不能邀请这个孩子。 太太想尽可能邀请多的孩子,他请你帮他算出他最多能邀请的孩子的数量。
Input
第一行包含一个整数n(2≤n≤1000)——太太糖果的数量 第二行包含n个整数a1,a2,…,an (1≤ai≤1e5)——糖果的大小。
Output
输出一个整数,即麦克可以邀请的孩子的最大数量。
Examples
Input
8
1 8 3 11 4 9 2 7
Output
3
Input
7
3 1 7 11 9 2 12
Output
2
Note
在第一个例子中,太太可以给一个孩子9+2=11,给另一个孩子8+3=11,给第三个孩子7+4=11。因此,他可以邀请三个孩子。注意,这不是唯一的解决方案。 在第二个例子中,太太可以给一个孩子3+9=12,给另一个孩子1+11=12。因此,他可以邀请两个孩子。注意,这不是唯一的解决方案。
题目描述
将这些糖果每个孩子分2个,并且每个孩子的糖果数量要相同,求这些糖果能够邀请孩子的最大数量
思路:枚举每个糖果与别的糖果的数量和,并使用map来记录每种糖果数量和出现的次数,次数最多的就表示能够邀请的最多的孩子,值得注意的是,在数量级不够大时,合理利用枚举计数这种思想
代码如下
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int n,a[1005],ans;
map<int,int> m;
int main()
{
int i,j;
while(~scanf("%d",&n))
{
ans = 0;
m.clear();
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
for(i = 0;i < n;i++)
{
for(j = i+1;j < n;j++) //从第i个糖果的下一个糖果进行计数,可以避免重复计算
{
int sum = a[i] + a[j];
if(!m.count(sum))
m[sum] = 1;
else
m[sum]++;
ans = max(m[sum],ans);
}
}
printf("%d\n",ans);
}
return 0;
}