【每日一题】4月9日题目精讲 Running Median

文章目录

    • 题目:
    • 题意:
    • 题解一:
    • 题解二:

题目:

–>链接<—

时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K,其他语言131072K 64bit
IO Format:%lld

题目描述

For this problem, you will write a program that reads in a sequence of
32-bit signed integers. After each odd-indexed value is read, output
the median (middle value) of the elements received so far.

输入描述:

The first line of input contains a single integerP(1≤P≤1000), which is the number of data sets that follow. The
first line of each data set contains the data set number, followed by
a space, followed by an odd decimal integer (1≤M≤9999), giving the total number of signed integers to be
processed. The remaining line(s) in the dataset consists of the
values, 10 per line, separated by a single space. The last line in the
dataset may contain less than 10 values.

输出描述:

For each data set the first line of output contains the data set
number, a single space and the number of medians output (which should
be one-half the number of input values plus one). The output medians
will be on the following lines, 10 per line separated by a single
space. The last line may have less than 10 elements, but at least 1
element. There should be no blank lines in the output.

示例1
输入
3
1 9
1 2 3 4 5 6 7 8 9
2 9
9 8 7 6 5 4 3 2 1
3 23
23 41 13 22 -3 24 -31 -11 -8 -7
3 5 103 211 -311 -45 -67 -73 -81 -99
-33 24 56
输出
1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3
-7 -3

题意:

给你m个数,一次输入,每当输入的个数为奇数时,输出按大小排列最中间的数
比如1 5 6 7 8
一开始输入1,输出1
然后输入1 5,不输出
输入1 5 6,输出5
输入1 5 6 7,不输出
输入1 5 6 7 8,输出6

题解一:

可以用堆来做
w1为大堆,w1用于存放小值
w2为小堆,w2存放大值
比如上面那个例子1 5 6 7 8
奇数位存在w1,偶数存在w2
如果w1.top()>w2.top(),就是w1的最大比w2的最小值大,就将这两个值互换,始终保证,w1的值比w2的任意一个都小,这样无论数据怎么读入,w1的最大值始终都是最中间的数
看下面模拟:
第一轮:
w1:1
w2:0
二:
w1:1
w2:5
三:
w1:1 6
w2:5
6>5
w1:1 5
w2:6

w1:1 5
w2: 7 6

w1:1 5 8
w2: 7 6
8>6
w1:1 5 6
w2; 7 8
这样每奇数轮,w1的top位就是答案

#include <iostream>
#include<queue>
#include<cstdio>
using namespace std;priority_queue<int>w1;//默认为大堆,从大到小priority_queue<int,vector<int>,greater<int> >w2;//默认为小堆
int main()
{// freopen("in.txt","r",stdin);//ios::sync_with_stdio(0);int n;cin>>n;int case1=0;int p,m,x;int minn,maxx;while(n--){cin>>p>>m;case1=0;printf("%d %d\n",p,m/2+1);for(int i=1;i<=m;i++){cin>>x;if(i%2==1)w1.push(x);else w2.push(x);if(i!=1){minn=w1.top();maxx=w2.top();if(minn>maxx){w1.pop();w2.pop();w1.push(maxx);w2.push(minn);}}if(case1!=0&&case1%10==0){cout<<endl;case1=0;}if(i%2==1){if(i==m)cout<<w1.top();elseprintf("%d ",w1.top());case1++;}}cout<<endl;while(!w1.empty())w1.pop();while(!w2.empty())w2.pop();}return 0;
}

(这个题的格式我一开始一直没注意。。。)

题解二:

我看很多人都是这么做的,但是只能过50%的数据。。包括我自己
我看了清楚姐姐的代码稍微改一下:
我们在读入一个数后,直接与w1.top比较,小于就存进去,大了就存w2里
当w1的数量多了,就把堆顶拿出给w2(小根堆)
w2多了就给大根堆
这样维护出来其实和上面的方法差不多
因为总数是奇数,两个堆数量一定不一样,多的那方,堆顶就是答案
代码:
清楚阿姨(狗头 )代码:

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>, greater<int> > q2; //小根堆 ,存较大的一半的数
priority_queue<int> q1;  //大根堆 ,存较小的一半的数
int main()
{int t;scanf("%d", &t);while(t--){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();  //优先队列没有clear函数,要一个一个弹出int m, n;scanf("%d %d", &m ,&n);printf("%d %d\n", m, (n+1)/ 2);int x;scanf("%d", &x);q1.push(x);printf("%d ", x);for(int i = 2; i <= n; i++){int x;scanf("%d", &x);if (x <= q1.top()) q1.push(x); //如果当前值比大根堆堆顶小,说明在小的这二分之一,塞进大根堆else  q2.push(x);int num1= q1.size();int num2= q2.size();if (num1 - num2 > 1)   //大根堆里面元素多了,把堆顶拿出来塞近小根堆{q2.push(q1.top());q1.pop();}else  if(num2 - num1 >1) //小根堆里面元素多了,把堆顶拿出来塞近大根堆{q1.push(q2.top());q2.pop();}if (i % 2 == 1)  //目前的元素个数是奇数{num1 = q1.size();num2 = q2.size();if(num1 > num2) printf("%d ", q1.top()); //中位数在大根堆else printf("%d ", q2.top());           //中位数在小根堆if (i % 20 == 19 && i!=n) printf("\n");}}printf("\n");}
return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【结论】区间和的和

区间和的和 题目大意&#xff1a; 给出一个数组&#xff0c;求出所有区间和的总和 输入样例&#xff1a; 3 1 2 3输出样例&#xff1a; 20数据范围&#xff1a; 对于30%的数据&#xff1a;1⩽n⩽1001\leqslant n\leqslant 1001⩽n⩽100 对于50%的数据&#xff1a;1⩽n⩽1…

.NET Core 2.1中的HttpClientFactory最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能&#xff0c;它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。介绍在.NETCore平台的2.1新增了HttpClientFactory&#xff0c;虽然HttpClient这个类实现了disposable&#…

树学

文章目录题目描述题解1&#xff1a;代码:题解2&#xff1a;代码&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:> %lld 题目描述 牛妹有一张连通图&#xff0c;由n个点…

jzoj5701-[gdoi2018day2]谈笑风生【莫比乌斯反演,二分,最短路】

正题 题目大意 nnn个点&#xff0c;每个点有一个wiw_iwi​&#xff0c;mmm条边&#xff0c;对于一条边(x,y)(x,y)(x,y)&#xff0c;边权为∑i1wx∑j1wy[gcd(i,j)1](ij)\sum_{i1}^{w_x}\sum_{j1}^{w_y}[gcd(i,j)1](ij)i1∑wx​​j1∑wy​​[gcd(i,j)1](ij) 选择一个最小的PPP使得…

csp-2019 复赛游记

文章目录Day0Day\ 0Day 0Day1Day\ 1Day 1Day2Day\ 2Day 2总结:csp−J:csp-J:csp−J:csp−s:csp-s:csp−s:遥远的梦想&#xff1a;Day0Day\ 0Day 0 早上&#xff0c;在运动会上乱搞一波&#xff0c;然后在10点左右到了机房&#xff0c;然后发现巨佬几枚&#xff0c;远看似在认证…

Rainbond v3.7.0:实现企业级PaaS的稳定性

Rainbond v3.7.0&#xff1a;实现企业级PaaS的稳定性Rainbond在v3.7.0版本中释出了大量平台稳定性更新&#xff0c;并在应用管理功能、安全性和系统安装三方面进行了部分优化。作为IT基础系统平台&#xff0c;Rainbond从低耦合的架构设计、高可用的部署方式、自恢复与容错的设计…

简单多边形三角化(暴力)

简单多边形三角化(暴力) 说在前面 网上流传着各种神奇的多边形三角剖分算法&#xff0c;但是讲道理&#xff0c;实现难度太高了。。。也没有搜到其他人的实现。这里写个最暴力的做法。。随机数据验证没问题&#xff0c;欢迎 hack 实现 一个简单多边形的耳朵定义为&#xff1a;如…

牛客网【每日一题】4月13号 Accumulation Degree

文章目录题目描述样例分析&#xff1a;题意&#xff1a;题解&#xff1a;代码&#xff1a;本题目传送题目树学是这个题的简易版&#xff0c;也涉及换根问题&#xff0c;可以先看看这个 树学 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768…

【二分】Distinct

Distinct 题目大意&#xff1a; 有n个军队&#xff08;有自己在x轴上的坐标&#xff09;&#xff0c;每个军队有一定的人&#xff0c;要一个坐标只有一个人&#xff0c;移动路程最大的士兵最少移动多长 原题&#xff1a; 题目描述 Daniel 正在玩一个战棋游戏。 现在 Danie…

P2839-[国家集训队]middle【主席树,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P2839 题目大意 nnn个数字&#xff0c;mmm次询问给出(a,b,c,d)(a,b,c,d)(a,b,c,d)表示左端点在[a,b][a,b][a,b]中&#xff0c;右端点在[c,d][c,d][c,d]的子区间中中位数最大的值。 解题思路 显然我们需要二分一下答案midmidm…

微软把UWP定位成业务线应用程序开发平台

微软把UWP定位成传统业务线&#xff08;LOB&#xff09;应用程序开发平台&#xff0c;以使用Windows Template Studio实现快速应用程序开发为重点。但是&#xff0c;为了把LOB开发人员吸引到UWP平台&#xff0c;他们在做的事情不止这些。最初发布时&#xff0c;通用Windows平台…

牛客网【每日一题】 合集

文章目录2020年3月25日 NC50439 tokitsukaze and Soldier 牛客练习赛50-C2020年3月26日 NC13230 合并回文子串 美团2017年CodeM大赛-初赛A轮2020年3月27日 NC15553 数学考试 2018年长沙理工大学程序设计竞赛2020年3月30日 NC50528 滑动窗口 《信息学奥赛一本通》Part5.52020年3…

NBA总冠军

NBA总冠军NBA总冠军NBA总冠军 题目描述 又要考试了&#xff0c;LJW决定放松一下&#xff0c;就打开电视&#xff0c;看见篮球赛&#xff0c;他立即想到了每年的NBA总冠军队伍。由于复习紧张&#xff0c;他只记起了一部分&#xff0c;记忆的内容是正确的&#xff0c;可能不是按…

P6773-[NOI2020]命运【线段树合并,树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6773 题目大意 nnn个点的一棵树&#xff0c;边权可以是000或111。mmm个条件(x,y)(x,y)(x,y)表示要求x,yx,yx,y之间要有边权值为111&#xff08;保证xxx是yyy的祖先&#xff09;&#xff0c;求方案数。 解题思路 考虑容斥&am…

读 《CSharp Coding Guidelines》有感

C# 编程指南前不久在 Github 上看见了一位大牛创建一个仓库&#xff1a;CSharpCodingGuidelines&#xff0c;打开之后看了一下 readme.md 相关描述&#xff0c;感觉应该很不错&#xff0c;于是就 clone 到本地拜读一下&#xff0c;这里列一些自己的笔记&#xff0c;方便日后回顾…

牛客网 【每日一题】4月10日 二分图染色(弱化版)

精讲 组合、容斥 文章目录题目&#xff1a;题意&&题解&#xff1a;&#xff1a;代码&#xff1a;题目传送题目&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld …

数字游戏(水博客ing / csp-J T1 / luogu 5660)

数字游戏 luogu 5660 题目大意&#xff1a; 给你一个长度为8的01串&#xff0c;分别表示你某一场比赛是否AKAKAK了&#xff0c;问你AKAKAK了几场比赛 输入样例#1 00010100输出样例#1 2输入样例#2 11111111输出样例#2 8样例解释#1 该 01 字符串中有 2 个字符 1。 样例…

P2231-[HNOI2002]跳蚤【容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P2231 题目大意 求一个由[1,m][1,m][1,m]的整数组成的长度为nnn的序列使得他们的gcdgcdgcd和mmm互质。 解题思路 考虑容斥减去不合法的答案。那就是要求序列的gcdgcdgcd和mmm不互质的个数&#xff0c;那么我们依旧需要容斥计…

微软Windows Community Toolkit一览

为了满足业务线开发人员的需求&#xff0c;微软推出了Windows Community Toolkit。这个快速变化的库充当了新的UWP控件和功能的测试基础。在创建UWP之初&#xff0c;其重点目标是智能手机和平板电脑。这意味着大部分开发预算都花费在控件上&#xff0c;确保这些控件能够在有限的…

牛客网【每日一题】4月14日题目精讲 Xorto

文章目录题目描述题解&#xff1a;代码&#xff1a;扩展传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format:%lld 题目描述 给定一个长度为n的整数数组&#xff0c;问有多少对互不重叠的非空区…