1054:主元素<消除法><sort><partial_sort><nth_element>

3 篇文章 0 订阅

http://pat.zju.edu.cn/contests/pat-a-practise/1054

解法

这个题目的解法,比较多的。

1. 把不同的元素一对一消除,最后剩下的便是主元素。

2. 先排序,主元素必是中位数。

提示:下表为0, 1, 2, ......n-1 的中位数是a[(n-1)/2]。


主要是想通过这个例子,对比一下三种sort的效率。

解法一

// 浙大13机试
// http://pat.zju.edu.cn/contests/pat-a-practise/1054
// 
// 主元素
//

#include <stdio.h>

#define SIZE 800*600+10

int a[SIZE];

int main()
{
#ifdef ONLINE_JUDGE
#else
	freopen("E:\\in.txt", "r", stdin);
#endif

	int m, n;
	while(scanf("%d%d", &m, &n) != EOF)
	{
		int len = m*n;
		int i, j;
		for(i=0; i<len; i++)
		{
			scanf("%d", &a[i]);
		}// read


		i=0, j=len-1;
		while(i<j)
		{
			while(a[i] == a[j])
			{
				i++;
			}//find target

			a[i] = -1;
			a[j] = -1;
			i++;
			j--;
		}

		for(i=0; i<len; i++)
		{
			if(a[i] != -1)
			{
				printf("%d\n", a[i]);
				break;
			}
		}
	}//while
	return 0;
}

解法二

// ------ sort, partial_sort, nth_element  -------------
#include <stdio.h>
#include <algorithm>

#define SIZE 800*600+10

using namespace std;

int a[SIZE];

int main()
{
#ifdef ONLINE_JUDGE
#else
	freopen("E:\\in.txt", "r", stdin);
#endif

	int m, n;
	while(scanf("%d%d", &m, &n) != EOF)
	{
		int len = m*n;
		int i, j;
		for(i=0; i<len; i++)
		{
			scanf("%d", &a[i]);
		}// read
		
		// sort(a, a+len);
		// partial_sort(a, a+(len-1)/2+1, a+len);
		nth_element(a, a+(len-1)/2, a+len);
		printf("%d\n", a[(len-1)/2]);
	}//while
	return 0;
}

效率比较

sort

partial_sort

nth_element

曾记否,它们的效率是这样的:nth_element > partial_sort > sort 。可是,在这里partial_sort < sort。

解法三

map
#pragma warning(disable : 4786)
#include <stdio.h>
#include <map>
using namespace std;

int main()
{
#ifdef ONLINE_JUDGE
#else
	freopen("E:\\in.txt", "r", stdin);
#endif

	map<int, int> mmap; //num, count
	int m, n;
	scanf("%d%d", &m, &n);
	int limit = m*n/2;
	m = m*n;
	while(m-->0)
	{
		int t;
		scanf("%d", &t);
		mmap[t] ++; //第一次使用时,会自动初始化为0
	}

	
	map<int, int>::iterator it = mmap.begin();
	for(; it != mmap.end() ;it++)
	{
		if(it->second > limit)
		{
			printf("%d\n", it->first);
			break;
		}
	}

	// 题目保证有结果,所以下面的代码,作为调试用
	if(it == mmap.end())
	{
		printf("No\n");
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FormInfo class FormInfo <<partial>> [ +Formlnfo0- button1 Click(sender:obiect, e:EventArgs) : void+ SetText(run:double, walk:double) : void Form <-- FormInfo Common class Common!+ static) map left lon : double +{static) map top lat : double +{static map right lon : double +{static' map bottom lat : double class Station { +longitute :double <<get>> <<set> >+latitude :double <<get> > <<set>> + staionname :string <<get>> <<set>> + stationlD :int <<get> > <<set>> + address :string <<get>> <<set> > + totalDocks :int <<get> > <<set> > + docksln :int <<get> > < <set> > + status : string <<get> > < <set> > Station-->"screenPoint"Point Form1 class Form1 <<partial>> !-imgH:int- imgW :int isStartSite : bool isEndSite : boolI startIndex :int- endIndex :int - isPlanRoute : bool = false- m distance : double = 0 +Form10 Form1 Shown(sender:obiect,e:EventArgs) : void panelRight SizeChanged(sender:obiect,e:EventArgs): void panelButtom SizeChanged(sender:object, e:EventArgs) : voidForm1 Paint(sender:object, e:PaintEventArgs) : void buttonlmport Click(sender:object, e:EventArgs) : void Import(fileName:string): void GPSToScreen(lon:double.lat:double): PointGetTitude(point:Point): doubel listStations SelectedlndexChanged(sender:obiect, e:EventArgs) : void panel2 Paint(sender:object, e:PaintEventArgs) : voidcheckAll Click(sender:obiect, e:EventArgs) : void comboBox1 SelectedndexChanged(sender:obiect.e:EventAras): voioDrawReqularPoly(x:float, y:float, radius:double, sideCount:int) : PointF panelMouse Paint(sender:obiect,e:PaintEventArgs) : void panelMouse MouseMove(sender:object, e:MouseEventArgs) : voidpanelMouse MouseClick(sender:object, e:MouseEventArgs) : voidbutton1 Click(sender:object, e:EventArgs) : void setRoute0:void - setWalkRoute() : void - comboBox1 TextChanged(sender:object, e:EventArgs) : void class"List1"<T>{ MapHelper class MapHelper!<<const>> EarthRadius : double = 6378.137Istatic' Rad(d:double) : double +Istatic' GetDistance(firstLatitude:double.firstLongitude:double, secondLatitude:doublesecondLongitude:double): double+Istatic1 GetPointDistance(firstPoint:string,secondPoint:string): double Form <-- Form1 Form1-->"allstation<Station>""List1"Form1-->"startPoint"Point Form1-->"endPoint"Point Form1-->"startList<PointFI>""List1" "routeList<PointFIl>""List1Form1-->Form1-->"endList<PointFIl>""List1"Form1-->"m formlnfo"FormInfo画类图
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值