CodeForces - 1121B:分糖果(枚举计数)

原题链接
太太书记每周都去小学给孩子们教编程,孩子们大多对编程提不起兴趣,所以他就给每个孩子两颗糖。他有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 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(水题)