OJ-NOI 1.10 09:明明的随机数(sort排序 or 桶排法)

http://noi.openjudge.cn/ch0110/09/

题目

描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入

有2行,第1行为1个正整数,表示所生成的随机数的个数:N;
第2行有N个用空格隔开的正整数,为所产生的随机数。

输出

也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400

我的代码

可以采用sort函数排序,
然后一个for循环 看排序后每个数是否与上一个数相同,以统计总数量
再一个for循环 ,输出

#include
#include
#include
#include
using namespace std;



int main()
{
	int n;
	cin >> n;
	int nums[101];
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
	{
		cin >> nums[i];
	}

	int nn = 1;

	for (i = 0; i < n; i++)
	{
		int min = i;
		for (j = i + 1; j < n; j++)
		{
			if (nums[min] > nums[j])
				min = j;
		}
		swap(nums[i], nums[min]);
	}

	for (i = 1; i < n; i++)
	{
		if (nums[i] != nums[i - 1])
			nn++;
	}
	cout << nn << endl;


	cout << nums[0] << " ";
	for (i = 1; i < n; i++)
	{
		if (nums[i] != nums[i - 1])
			cout << nums[i] << " ";
	}


	return 0;
}

参考代码

使用桶排法

#include
#include
#include
#include
#include
using namespace std;
int x[1001];
int main()
{
int a,b,c,d,e,f,g,h,i,j,k,l,m,n;
scanf("%d",&n);
for(a=1;n>=a;++a)
{
scanf("%d",&b);
x[b]=1;
}
for(a=1,b=0;1000>=a;++a)
{
if(x[a])
{
++b;
}
}
printf("%d\n",b);
for(a=1;1000>=a;++a)
{
if(x[a])
{
printf("%d ",a);
}
}
return 0;
}

感觉这个方法特别巧妙,

  • 首先定义一个容量为1001的数组,并将他们初始化为0;(为什么数组容量是1001?因为题目说每个参与排序的随机数大小都是)
  • 然后根据输入的数据n,把下标为i 的数组元素置1;
  • for循环,统计所有值为1的元素数量
  • for循环,对所有值为1的元素,输出其下标

这样的过程利用了 数组本身每个下标的有序性的唯一性,完成了排序和去重复,过程很简单,但是占用内存比较多

你可能感兴趣的:(AC日记)