牛客多校第四场 G Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G
来源:牛客网
输入描述:
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first line contains two integers n and m (1 ≤ n ≤ 105, 0 ≤ m < n) -- the length of the sequence and the number of integers to delete.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) denoting the sequence.
It is guaranteed that the sum of all n does not exceed 106.
输出描述:
For each test case, output an integer denoting the only maximum mode, or -1 if Chiaki cannot achieve it.
输入例子:
5
5 0
2 2 3 3 4
5 1
2 2 3 3 4
5 2
2 2 3 3 4
5 3
2 2 3 3 4
5 4
2 2 3 3 4
输出例子:
-1
3
3
3
4
-->
输入
5
5 0
2 2 3 3 4
5 1
2 2 3 3 4
5 2
2 2 3 3 4
5 3
2 2 3 3 4
5 4
2 2 3 3 4
输出
-1
3
3
3
4
题意:给出一个n个数的序列,我们可以删除m个数,然后我们要求出现次数最多并且最大的,
也就是如果出现次数最多的有多个,那就必须删除其他的数,避免出现次数最大的有多个,然后我们要求值最大,所以我们还要尽量判断值大的
例如 输入 7 3
2 2 2 2 4 4 5
出现次数最多的是2,但是我们可以删去3个2然后就可以取4了,有人会问为什么不取5呢,
因为我们最多删三次,我们要使5是出现次数最多并且没有重复的,只能把其他6个数都删了,
但是次数不够,所以不行
思路:既然我们要取次数最多并且值最大的,如果我们取当前这个数的话,我们肯定出现次数相同还有重复的话,我们优先肯定是取最大的,但是我们又要把
所有次数比他多的删掉,因为取这个数就代表当前这个数的出现次数最多,但是我们不知道哪些比它多,我们直接遍历的话会超限,所以我们贪心,先用map
记录下每个数出现的次数,然后我们用迭代器遍历,按次数最多的排前,然后次数相等的把大的排后面
(因为我们是按次数从大到小排的,所以我们要把前面那些次数比当前位置多的都减成比他小,但是相同次数的时候我们取值大的,所以次数相等的时候按值的升序排)
具体看代码的注释
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
struct sss
{
ll x,y;
sss(){};
sss(ll a,ll b){x=a;y=b;};
}a[];
int cmp(struct sss x,struct sss y)
{
if(x.y==y.y)
return x.x<y.x;
return x.y>y.y;
}
int main()
{
int t;
int n,m;
map<ll,ll> mp;
scanf("%d",&t);
while(t--)
{
mp.clear();
ll x;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)//记录每个数的出现次数
{
scanf("%lld",&x);
mp[x]++;
}
int cnt=;
for(map<ll,ll>::iterator it=mp.begin();it!=mp.end();it++)//把每个数及其出现次数取出来
{
a[cnt].x=it->first;
a[cnt++].y=it->second;
}
sort(a,a+cnt,cmp);//贪心按次数从高到低,相等值升序排序
ll sum=;
ll flag=,num=;//sum记录的是前面总的出现次数
for(int i=;i<cnt;i++)
{
if(i<cnt-&&a[i].y==a[i+].y)//判断次数是否是相等的,相等的时候直接取最大的那个,(一定要加i<cnt-1,没加wa了,然后一直找错(>_<) ,,)
{
sum+=a[i].y;//累加次数
continue;
}
else{
if(flag==)//第一个直接取
{
if(sum-i*(a[i].y-)<=m)//判断是否可以删除这么多数
{
flag=;
num=a[i].x; //num存的是答案
}
}
else{
if(a[i].x>num) //我们贪心取答案最大的,然后我们再判断是否可以删这么多
{
if(sum-i*(a[i].y-)<=m)
{
flag=;
num=a[i].x;
}
}
}
sum+=a[i].y;
}
}
if(flag==) printf("-1\n");
else printf("%lld\n",num);
}
}
牛客多校第四场 G Maximum Mode的更多相关文章
- [2019牛客多校第四场][G. Tree]
题目链接:https://ac.nowcoder.com/acm/contest/884/G 题目大意:给定一个树\(A\),再给出\(t\)次询问,问\(A\)中有多少连通子图与树\(B_i\)同构 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 牛客多校第四场 F Beautiful Garden
链接:https://www.nowcoder.com/acm/contest/142/F来源:牛客网 题目描述 There's a beautiful garden whose size is n ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2019牛客多校第四场 A meeting
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- 2019年牛客多校第四场 B题xor(线段树+线性基交)
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
随机推荐
- libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作
http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...
- 使用C#读取网站相对路径文件夹下所有图片
public JsonResult GetCourseInitCover() { //设置相对路径 string imgurl = Server.MapPath("~/Content/ima ...
- hdu-2709整数划分 技巧
整数划分变形,由2^k组成. 整数划分中一个节约内存的技巧,平时我们使用dp[i][j]维护用不大于j的数组合成i的方案数,所以必须dp[i-j][j]->dp[i][j].这样就需要二位,如果 ...
- vue.js用select实现省,市,提交后,默认显示省,市信息
<select v-model="citys" name="cityVal" @change="schoolName(citys)"& ...
- 安装redisPHP扩展
1. "predis/predis":"~1.1@dev" 2.composer update 即可,这是给项目添加redis扩展 启动服务端 redis-se ...
- git部署
1. 自动部署原理 先讲实现方法和原理.Git服务和仓库都是在服务器上的,服务器上的Web目录和本地都有完整的代码.Git有个叫hook的机制,可以在代码更新时执行回调(执行一段shell).一般执行 ...
- MySQL之库表详细操作
一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf8; 1.2 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使 ...
- Ubuntu深度学习环境搭建 tensorflow+pytorch
目前电脑配置:Ubuntu 16.04 + GTX1080显卡 配置深度学习环境,利用清华源安装一个miniconda环境是非常好的选择.尤其是今天发现conda install -c menpo o ...
- 2017-2018 ACM-ICPC Latin American Regional Programming Contest D.Daunting device
题意:一个数组n个操作每次先查询p颜色的数量然后求出区间,区间染色成x,然后求最大染色数 题解:odt裸题,多维护一个color个数数组就好了 //#pragma comment(linker, &q ...
- flex对象.show()的时候display变成block
在css中设置display: none;的对象会出现这种情况. 在JavaScript中用.hide()隐藏的对象不会出现.