您的位置:首页 > 其它

众数问题

2016-09-08 15:49 127 查看


众数问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3

描述

所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数,

多重集合S重的重数最大的元素成为众数。例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。

现在你的任务是:对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。

输入第一行为n,表示测试数据组数。(n<30)

每组测试的第一行是一个整数m,表示多重集S中元素的个数为m

接下来的一行中给出m(m<100)个不大于10万的自然数

(不会出现不同元素出现的次数相同的情况,如:S={11,11,22,22,33,33})。

输出每组测试数据输出一行,包含两个数,第一个是众数,第二个是其重数,中间以空格隔开。
样例输入
1
6
1 2 2 2 3 5


样例输出
2 3


题解:

数据量小的可怜,时间3000,随便写。

思路一:将数组进行排序,然后进行一遍扫描即可统计出想要的答案 。

思路二:算法课上学的分治,感觉用在这里好别扭。。。

代码一:排序后的分治-----1

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;

int a[105];

int divide_conquer(int start,int end){

if(end<start)
return 0;

int middle = (start+end)>>1;
int ans = a[middle];
int count=1;

int i;
for(i=middle+1; i<=end; i++){
if(ans==a[i])
count++;
else
break;
}
int j;
for(j=middle-1; j>=start; j--){
if(ans==a[j])
count++;
else
break;
}
int ans1 = divide_conquer(start,j);
int ans2 = divide_conquer(i,end);
if(count>(ans1%100) && count>(ans2%100))
return ans*1000+count;
if((ans1%100)>count && (ans1%100)>(ans2%100))
return ans1;
return ans2;
}

int main(){

int T;
scanf("%d",&T);
int N;
while(T--){
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d",a+i);
sort(a,a+N);
int ans = divide_conquer(0,N-1);
printf("%d %d\n",ans/1000,ans%100);
}
return 0;
}

代码二:排序后的分治-----2
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;

int a[105];

int divide_conquer(int start,int end){

int middle = (start+end)>>1;
int ans = a[middle];
int count=1;
int ans1=0,ans2=0;

int i;
for(i=middle+1; i<=end; i++){
if(ans==a[i])
count++;
else
break;
}
int j;
for(j=middle-1; j>=start; j--){
if(ans==a[j])
count++;
else
break;
}
if(j-start+1 > count)
ans1 = divide_conquer(start,j);
if(end-i+1 > count)
ans2 = divide_conquer(i,end);

if(count>(ans1%100) && count>(ans2%100))
return ans*1000+count;
if((ans1%100)>count && (ans1%100)>(ans2%100))
return ans1;
return ans2;
}

int main(){

int T;
scanf("%d",&T);
int N;
while(T--){
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d",a+i);
sort(a,a+N);
int ans = divide_conquer(0,N-1);
printf("%d %d\n",ans/1000,ans%100);
}
return 0;
}

代码三:排序之后一遍扫面即可
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int Mul_Num;
int Mul_Count;

int main(){

int T;
scanf("%d",&T);
int N,a[105];
int tmp_num,tmp_count;
while(T--){
Mul_Count = 0;
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d",a+i);
sort(a,a+N);
tmp_num = a[0];
tmp_count = 1;
for(int i=1; i<N; i++){
if(tmp_num!=a[i]){
if(Mul_Count<tmp_count){
Mul_Count = tmp_count;
Mul_Num = tmp_num;
}
tmp_num = a[i];
tmp_count = 1;
}
else
tmp_count++;
}
if(Mul_Count<tmp_count){
Mul_Count = tmp_count;
Mul_Num = tmp_num;
}
printf("%d %d\n",Mul_Num,Mul_Count);
}
return 0;
}

代码四:数据记录,由于数据范围小,可以以空间换时间 ,空间上浪费了 100000/100 = 1000倍
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

int Mul_Num;
int Mul_Count;
int a[100005];
int main(){

int T;
scanf("%d",&T);
int N,num;
while(T--){
Mul_Count = 0;
memset(a,0,sizeof(a));
scanf("%d",&N);
for(int i=0; i<N; i++){
scanf("%d",&num);
a[num]++;
if(a[num]>Mul_Count){
Mul_Count = a[num];
Mul_Num = num;
}
}
printf("%d %d\n",Mul_Num,Mul_Count);
}

return 0;
}

代码五:空间换时间的优化,map实现数据离散化 
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;

map<int,int> my_map;
int Mul_Num;
int Mul_Count;

int main(){

int T;
scanf("%d",&T);
int N;
int num;
while(T--){
Mul_Count = 0;
my_map.clear();
scanf("%d",&N);
for(int i=0; i<N; i++){
scanf("%d",&num);
my_map[num]++;
if(my_map[num]>Mul_Count){
//Mul_Count = my_map[num];
Mul_Count++;
Mul_Num = num;
}
}

//for(map<int,int>:: iterator it = my_map.begin(); it!=my_map.end(); it++)
//printf("%d %d\n",it->first,it->second);
//cout << endl;

printf("%d %d\n",Mul_Num,Mul_Count);
}
return 0;
}

分享一个不错的题解链接

http://blog.csdn.net/net_assassin/article/details/8986512
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NYOJ 95 众数问题