您的位置:首页 > 其它

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

2014-03-09 09:47 253 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: