博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
寻找捣乱分子对
阅读量:4155 次
发布时间:2019-05-25

本文共 981 字,大约阅读时间需要 3 分钟。

问题描述:多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:176, 178, 180, 170, 171

      这些捣乱分子对为<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对)

      思路:最简单的就是用两层循环,即考察每个元素,检查该元素后面的元素是否小于它,如果是就找到一个捣乱分子对。复杂度为O(n^2)。这道题的一种改进方案是用分治法,用到了归并排序的思想。我们可以将数组分成两部分,总的捣乱分子对为: 前半部分的捣乱分子对 + 后半部分的捣乱分子对 + X,这里的X为两部分合并中出现的捣乱分子对,什么情况下会出现呢?假设前半部分的元素范围为 A[from] 到A[mid],后半部分的元素范围为A[mid + 1] 到A[to],考虑前半部分的某元素A[i]和后半部分的某元素A[j],如果A[j] < A[i],由于两部分都是排好序的,因此捣乱分子对增加 mid - i + 1个,也就是说A[j]小于A[i], A[i+1].. A[mid],这个关系显然成立。

一般的解题步骤就要想到二分,递归,动态规划,最后是搜索

int Merge(int *pArray, int from, int mid, int to){	int i = from, j = mid + 1;	int k = 0, num = 0;	int *pTmp = new int[to-from+1];		while(i<=mid && j<=to) //归并排序的主框架	{		if(pArray[i] <= pArray[j])			pTmp[k++] = pArray[i++];		else		{			num += (mid - i + 1);         //增加捣乱分子对			for(int l = i; l <= mid; l++) //输出捣乱分子				cout<
<<' '<
<

转载地址:http://kteti.baihongyu.com/

你可能感兴趣的文章
混淆的概念:SIF、CIF、4CIF、D1
查看>>
data_seg
查看>>
VC 运行时库 /MD、/MDd 和 /MT、/MTd
查看>>
BITMAPFILEHEADER、BITMAPINFOHEADER及BMP结构详解
查看>>
把类成员函数封装成线程API所需要的函数
查看>>
HTTP Live Streaming直播(iOS直播)技术分析与实现
查看>>
使用rapidxml操作xml~读写文件操作
查看>>
rapidxml,一个快速的xml库
查看>>
DMP文件的生成和使用
查看>>
在COM中使用数组参数-ICollection
查看>>
Ribbon界面图标可以直接用PNG做透明图标
查看>>
向其他软件窗口、控件发送消息的方法
查看>>
word或者pdf文件全部保存为图片的方法
查看>>
VS2010下SQLite3生成lib库文件
查看>>
sqlite3的helloworld
查看>>
MFC下支持中文的SQLite3封装类使用
查看>>
简单高效的多线程日志类
查看>>
研华USB4711A采集卡高速中断模式采集总结
查看>>
从零起步CMFCToolBar用法详解
查看>>
CMFCRibbonStatusBar用法
查看>>