应该是最短的代码了吧(仅限c)

· · 题解

题目的要求很简单,根据众数的定义我们可以知道,当有多个数一样时这几个数都是众数,所以我们要尽可能的去维护一个能让各个数中出现次数的最大值所包含的数最多例如: 当我们有1 2 3 3 4时 我们应该将它们排列为1 2 3 4 3 这样我们的众数和就是1 1+2 1+2+3 1+2+3+4 3即为最大解 而其余的排列方法均是小于它的(至于为什么,你们自己试试就知道了) 所以我们就把所有的数字最分散地排列就行了 下面就是代码:

#include<iostream>
//头文件也可以用#include<bits/stdc++.h>
using namespace std;
long long n,ans,a[1000005],sum[1000005],cnt;
int main(){
    scanf("%lld",&n);//平时用scanf的话这里记得用%lld 
    for(int i=1;i<=n;i++) {
        scanf("%lld",&a[i]);
    }
    for(int i=n;i>=1;i--){
        while(cnt<a[i]) sum[++cnt]+=i+sum[cnt-1];//前缀和
        ans+=sum[a[i]];
    }
    printf("%lld",ans);
    return 0;
}