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;
}