ccf- 数字排序

问题描述

  给定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;
}
发布了84 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunandstarws/article/details/99115912