问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
思路:这个题目怕是有毒,题目很简单,思路也很简单。我最初想用结构体写但是发现太麻烦了。就把结构体变量没有消除,结果评测系统说我编译错误,原来是我定义结构体使用错误。要struct。后面换了一种方法,想用快速排序,发现自己忘记怎么写了(果然acm算法这种东西要经常写),后面就暴力查找,不过后面还是用结构体实现了一下。现在真害怕ccf提交不提示是否对错,编译错误,那也太。。。代码如下:
c:
#include<stdio.h>
struct stu{
int x;
int y;
};
int main(){
int n;
int temp;
int max,maxi;
int a[1001]={0};
// stu temp1;
scanf("%d",&n);
int i,j;
char c;
// struct stu b;
// struct stu s[1001];
for(i=0;i<n;i++){
scanf("%d",&temp);
a[temp]++;
// s[temp].x=temp;
}
for(i=0;i<n;i++){
max=a[0];
maxi=0;
for(j=1;j<=1000;j++){
if(a[j]>max){
maxi=j;
max=a[j];
}
}
a[maxi]=0;
if(max!=0)
printf("%d %d\n",maxi,max);
}
return 0;
}
c++(结构体)
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
struct st{
int x;
int y;
};
int cmp(struct st m,struct st n){
if(m.y==n.y){
return m.x<n.x;
}
return m.y>n.y;
}
int main(){
int n,m;
int i,j;
int temp;
struct st a[1001]={0,0};
scanf("%d",&n);
int sum=0;
for(i=0;i<n;i++){
scanf("%d",&temp);
if(a[temp].y==0)
sum++;
a[temp].y++;
a[temp].x=temp;
}
sort(a,a+1001,cmp);
for(i=0;i<sum;i++){
printf("%d %d\n",a[i].x,a[i].y);
}
return 0;
}