#38错了求调
查看原帖
#38错了求调
996068
goodmoon楼主2023/7/17 22:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e6+5;
int n,k,a[MAXN],cnt[MAXN],fre[MAXN],s[MAXN],maxcnt,ans;
signed main() {
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lld",a+i);
        cnt[a[i]]++; //统计每个数出现的次数
        maxcnt=max(maxcnt,cnt[a[i]]); //记录max(cnt) 
    }
    //判断是不是有无限个
    if(k>=maxcnt){
    	printf("pigstd");
    	return 0;
	}
    for(int i=1;i<=n;i++){//这里遍历的是每个数 
        fre[cnt[i]]++; //统计每个出现次数的数目
        s[cnt[i]]+=cnt[i]; //记录前缀和,表示出现次数小于等于i的数的总和
    }
    //计算前缀和
    for(int i=1;i<=n;i++){
        fre[i]+=fre[i-1];
        s[i]+=s[i-1];
    } 
    for(int i=1;i<=n;i++){
        //如果某个数的出现次数加上k大于n,那么该数一定可以成为众数
		if(cnt[i]+k>n){
            ans++; 
            continue;
        }
        //判断k是否大于等于除去出现次数为i的数之外,其他数的总和
        if(k>=s[n]-s[cnt[i]+k]-(cnt[i]+k)*(fre[n]-fre[cnt[i]+k])){
            ans++;
        }
    }
    printf("%lld",ans); 
    return 0;
}
2023/7/17 22:33
加载中...