牛客网暑期ACM多校训练营(第四场)G Maximum Mode(思维)
链接:
https://www.nowcoder.com/login?callBack=%2Facm%2Fcontest%2F142%2FG
题意:
给定n个数, 要求删去恰好m个数后的最大总数是多少。
分析:
要使一个数是众数, 只要比他大的数的数量都比自己小就行。
预处理出全部出现次数的最大数(例如, 出现3次最大的是1,出现2次最大的是2等等)。
然后从最大的次数开始枚举, 只关注该次数和比该次数大的数(前缀和),求出每次删的minDel即可。
#include <bits/stdc++.h> using namespace std; const int maxN = 1e5 + 7; map<int, int> cnt, Max, t; int pre[maxN]; int n, m; int judge(){ int sum = 0, k = 0, ans = -1; for(auto it = Max.rbegin(); it != Max.rend(); it++){ int a = it -> first, b = it -> second; //a是次数, b是该次数下最大的数 k += t[a];//k是当前有多少种数 sum += a * t[a]; //只考虑自己和次数比自己大的数的总数 int minDel = sum - (a-1) * k - 1; //要减去的数 if(minDel <= m){//只要该数小于等于m即可, 剩下的m - minDel随便减 ans = max(ans, b); } } return ans; } int main() { int T; scanf("%d", &T); while(T--) { cnt.clear(); Max.clear(); t.clear(); scanf("%d %d", &n, &m); for(int i = 0; i < n; i++) { int num; scanf("%d", &num); cnt[num]++; } for(auto it : cnt){ int a = it.first, b = it.second; Max[b] = max(Max[b], a); t[b]++; } printf("%d\n", judge()); } }
标签:
思维
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf