c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...
分治法求众数
Problem Description
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为
众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。
求众数方法很多,现要求你用分治算法来试一试,并分析其效率。
编程任务:对于给定的由n个自然数组成的多重集S,采用分治算法编程计算S的众数及其重数。
Input
第1行多重集S中元素个数n;接下来的一行为集合S,有n个自然数。( n < 1000000 )
Output
结果输出:输出2个数,第1个数为众数,第2个为其重数。
当有多个同样重数的众数,优先输出数值更小的数的众数。
Sample Input
6
1 2 2 2 3 5
Sample Output
2 3
Hint
提示陆续写上来,不着急,先自行思考和讨论……
Solution
题目说要用分治的解法,不过如果想过这题,一个for循环也是暴力统计求解。
但既然是要学算法,那我们当然要用分治的思想啦!
分治策略
1.我们首先假设中间的元素是众数
2. 然后由两边向中间遍历,直到左右都出现值等于众数的数,记录下众数和重数
3. 这样就将一个数组分为三部分,我们再对左右部分执行上述步骤
4. 注意:使用分治策略解决众数问题需要原集合有序,在原集合无序的情况下需要对其排序,建议数据输入之后先进行排序
当真正理解了分治的思想,这题就迎刃而解啦。这题的分治体现在将数组分为三部分进行众数的统计,可以参考下图理解。
Code
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef pairpi;
const int maxn=1e5+100;
const int N=1e6+100;
const int M=1e5+100;
const int mod=1e9+7;
int n,m,T;
int a[N];
int ans=0; //众数的重数
int idx=0; //众数的下标
void split(int l,int r) //分治算法
{
if(l>r)return;
int ll=l; //记录原来的l位置
int rr=r; //记录原来的r位置
int mid=(l+r)>>1;
for(; l
for(; r>mid&&a[r]!=a[mid]; r--); //寻找众数的最右边
//经过两个for循环后,众数个数就是r-l+1
if(ans<=r-l+1) //更新答案
{
if(ans==r-l+1)
{
idx=min(mid,idx);
}
else
idx=mid;
ans=r-l+1;
}
if(l-1-ll+1>=ans) //剪枝
split(ll,l-1); // 对左边部分分治
if(rr-r-1+1>=ans) //剪枝
split(r+1,rr); // 对右边部分分治
}
void solve()
{
scanf("%d",&n);
for(int i=0; i
scanf("%d",a+i);
sort(a,a+n); //先排序,方便统计众数个数
int l=0;
int r=n-1;
split(l,r);
printf("%d %d\n",a[idx],ans);
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
solve();
/*
*
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
}
最后感谢小伙伴们的学习噢~
c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- python 过采样 权重实现_不平衡数据集的处理 - osc_sqq5osi1的个人空间 - OSCHINA - 中文开源技术交流社区...
一.不平衡数据集的定义 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡.以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下 ...
- java顺序表冒泡排序_冒泡排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...
冒泡排序就这么简单 在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的).现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了. 排序对我 ...
- c语言输出三门课程平均值,实验作业一 - 先奕宣202005018110的个人空间 - OSCHINA - 中文开源技术交流社区...
缩写程序,输出以下信息: **********¥¥ ¥¥¥ This is my first C program! **********¥¥¥¥¥ int main() { printf(" ...
- 利用mysql建立随机森林_随机森林算法实例 - osc_4imme0wh的个人空间 - OSCHINA - 中文开源技术交流社区...
根据成年人数据集来预测一个人的收入 1.准备数据集 我下载好了一个成年人数据集,从百度云下载 链接:https://pan.baidu.com/s/10gC8U0tyh1ERxLhtY8i0bQ 提取 ...
- scaling之旅_机器学习算法之旅 - lwaif的个人空间 - OSCHINA - 中文开源技术交流社区...
机器学习领域有很多算法,然后每种算法又有很多延伸,所以对于一个特定问题,如何确定一个正确的算法是很困难的.本文中我想给你们两种方法来归纳在现实中会遇到的算法. 学习方式 根据如何处理经验.环境或者任何 ...
- java拆分任意五位数_五位数拆分出各位 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...
5.输入一个五位数,输出一个反转的五位数 输入->12345 输出->54321 //这是五位数字拆分方法. System.out.println("请输入五位数的数字:&quo ...
- flutter 刷脸_支付宝刷脸认证 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
去支付宝下载sdk 这里引用我就不多说了 Loader::import('ali.wappay.service.AlipayTradeService',EXTEND_PATH,'.php'); Lo ...
- Java实现数组列项相加_裂项求和法 - osc_rkun22vq的个人空间 - OSCHINA - 中文开源技术交流社区...
常用公式 常用式:$\cfrac{1}{n(n+1)}=\cfrac{1}{n}-\cfrac{1}{n+1}$:推广式:$\cfrac{1}{n(n+k)}=\cfrac{1}{k}(\cfrac{ ...
- python读写磁盘扇区数据有什么用_磁盘存放数据原理 - osc_v8xs2czi的个人空间 - OSCHINA - 中文开源技术交流社区...
磁盘结构作用数据原理 拓扑图 盘面(side) 模型: 1.磁盘圆形盘面,一个磁盘内含有多个盘面. 2.层叠关系,每个盘面之间不会贴着. 3.第一个盘的正面成为0面,反面为1面:第二个盘正面为2面,反 ...
最新文章
- BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
- share团队冲刺3
- ZOJ 2165 Red and Black
- 图文并茂重新认识下递归
- Bzoj3309-DZY Loves Math【莫比乌斯反演,线性筛】
- 【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案
- OpenCV4每日一练day10:图像校正
- MySQL的SQL优化常用30种方法
- 加拿大计算机专业前八大学,加拿大留学:计算机工程专业排名前八的名校详情...
- flv格式怎么转换成mp4?视频格式转换步骤详解
- Script Identification of Multi-Script Documents: A Survey
- 第五项修炼与架构师感想
- WinUsb_ReadPipe和WinUsb_WritePipe函数功能理解
- htonl ntohl htons ntohs
- 手机怎么解决同ip多账号_抖音播放量低怎么办?如何提高抖音播放量上热门?...
- C语言 | 单链表的冒泡排序
- 一天半辛苦的搞机过程
- T1042/T2080 U-BOOT 移植阶段(四)调试网口问题不通解决
- uni-app - 城市选择索引列表 / 通过 A-Z 排序的城市列表(uview 组件库 IndexList 索引列表)
- C# 获取当前屏幕大小 获取屏幕大小