题目说
可以选择序列里的任意两个元素相加,记作ai和aj,然后把ai+aj放进序列里,再删掉ai和aj其中的随便一个。
那么很容易就能够想到,如果ai与aj相等,那么直接把ai或aj与当前序列里最大的数相加,然后再把ai或aj扔掉,这样就是最少的操作次数。
再一想,这最少的次数其实就是序列里的相同数的个数,如序列里有
1 2 2 4 4 4
最少的次数是3,相同数的个数是一个2,两个4,所以是3.
那么就转化为求序列里有几个数是重复的,就是原来的序列的元素个数-去重后的
代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;

int main()
{
    int a[100000];
    int g;
    cin>>g;
    for(int i=0;i<g;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a,a+g);
    int n=a+g-unique(a,a+g);
    cout<<n<<endl;
    return 0;
}