2015年3月
CCF考试第二题:
运用散列解题
本题虽然使用c++编写,但没有用到c++中的功能,只需将头文件换成#include<stdio.h>就是可以作为c语言通过编译
思路
依据题目信息本体考察的是计数能力,所以通常利用散列方法来解题。
方法一:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int n,x;
int max[1010]={0};
cin>>n;
int a[1010]={0};
for(int i=0;i<n;i++)//运用散列记录数据
{
cin>>x;
a[x]++;
}
int g=0;
for(int i=1;i<=1000;i++)//将有效数的个数存入一个数组
{
if(a[i]!=0)
{
max[g++]=a[i];
}
}
int temp=0;
for(int i=0;i<g-1;i++)//将上面数组进行降序排列
{
for(int j=0;j<g-i-1;j++)
{
if(max[j]<max[j+1])
{
temp=max[j];
max[j]=max[j+1];
max[j+1]=temp;
}
}
}
int k=0;
for(int i=0;i<n;i++)
{
for(int j=1;j<=1000;j++)
{
if(a[j]!=0&&a[j]==max[k])
{
cout<<j<<' '<<a[j]<<endl;
a[j]=0;
k++;//后移
break;
}
}
}
return 0;
}
下面方法是利用sort函数排序的简便方法适用与c++
方法二:
#include<iostream>
#include<algorithm>
#define MAX 1010
using namespace std;
struct sanlie//创造结构体方便后面排序
{
int xiaobiao;
int zhi;
};
bool cmp(sanlie a,sanlie b)//cmp函数在sort中运用
{
if(a.zhi!=b.zhi)//若值不相等
return a.zhi>b.zhi;//按从大到小排序
else //若值相等
return a.xiaobiao<b.xiaobiao;//按从小到大排序
}
int main(){
sanlie a[MAX];
int n,k;
cin>>n;
for(int i=0;i<1010;i++)//初始化
{
a[i].xiaobiao=i;
a[i].zhi=0;
}
for(int i=0;i<n;i++)//通过散列计数
{
cin>>k;
a[k].zhi++;
}
sort(a,a+1001,cmp);//排序0-1000元素所以为1001
for(int i=0;i<=1000;i++)
{
if(a[i].zhi!=0)//从大到小输出
{
cout<<a[i].xiaobiao<<' '<<a[i].zhi<<endl;
}
else//退出
{
break;
}
}
return 0;
}
有不懂的地方可以留在评论区。
祝大家CCF都能顺利通过