蒟蒻第一次打挑战赛过了签到题(太好了太好了!)

最开始想用一个数组下标为另一个数组来计数,但是发现好像不行,因为会越界
比如这样

b[a[i]]++;

因为n<= 100000,而数据范围是到了1e9;
N = 100010,所以当初是开的100010的数组,像上面这样必定越界,就这样wa了两发
然后思索一下,改成了下面这种,判断
a[i]是否与a[i+1]相等的形式,然后用数字相同就cnt不用加一,数字不同cnt就+1,
用cnt来作为b数组的下标,同样达到计算的目的。

自己的AC代码:

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

const int N = 100010;
long long int a[N],b[N];
int n;
int main()
{
    cin>>n;
    for(int i = 0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
//     for(int i = 0;i<n;i++)
//     {
//         cout<<a[i]<<" ";
//     }
//     cout<<endl;
    int cnt = 0;
    for(int i = 0;i<n;i++)
    {
        if(a[i]==a[i+1])
            b[cnt]++;//b数组存储的是a数组中数字出现的次数 
        else
        {
            b[cnt]++;
            cnt++;
        }
    }
    cnt = 0;
    long long int max_number = 0;
    for(int i = 0;i<n;i++)
    {
        if(a[i]==a[i+1])
            max_number = max(a[i]*b[cnt],max_number);
        else
        {
            max_number = max(a[i]*b[cnt],max_number);
            cnt++;
        }
    }
    cout<<max_number;
}

看了别人的题解,发现真的可以像这样b[a[i]]++的感觉来写,不过要用map

尝试一下(搜了一下map和auto用法打的)
别人的AC代码:

算法参照这个代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47509767

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

typedef long long ll;
const int N = 100010;

map<ll,ll>m;

int n;

int main()
{
    cin>>n;
    int a[n];
    for(int i = 0;i<n;i++)
    {
        cin>>a[i];
        m[a[i]]++;
    }
    long long int sum = 0;
    for(auto [x,y]:m)
    {
        sum=max(sum,x*y);
    }
    cout<<sum;
}