洛谷P1059 [NOIP2006 普及组] 明明的随机数

/*题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,
他先用计算机生成了N个11到10001000之间的随机整数(N≤100)(N≤100),
对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着
不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同
学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第1行为1个正整数,表示所生成的随机数的个数N
第2行有NN个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第1行为1个正整数N,表示不相同的随机数的个数。
第2行为N个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入输出样例
输入
10
20 40 32 67 40 20 89 300 400 15
输出 
8
15 20 32 40 67 89 300 400
说明/提示
NOIP 2006 普及组 第一题 */
#include<iostream>
#include<algorithm>//sort函数在的头文件 
using namespace std;
int main() {
	int N=0, k = 0;
	int a[100];//原数组 
	int b[100];//删除重复后的数组 
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> a[i];
	}
	sort(a, a + N);
	for (int i = 0; i < N; i++) {
		if (i == 0) {
			if (a[1] != a[0]) {
				b[0] = a[0];
				k++;
			}
			else {
				b[0] = a[1];
				k++;
			}
		}
		else {
			if (a[i] != a[i - 1]) {
				b[k] = a[i];
				k++;
			}
		}
	}
	cout << k << endl;
	for (int i = 0; i < k; i++) {
		cout << b[i] << " ";
	}
	return 0;
}
//思想:直接利用排好的数组,相同的肯定会在旁边删除另一个就行 
本次收获
  1. 对于删除相同的数字,字符可以先排序,再进行删除。
  2. 对于sort函数的应用
C++sort()函数的用法
sort()函数使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n)
Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三
个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,排序方法)
例一:sort函数没有第三个参数,实现的是从小到大
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 	int a[10]={9,6,3,8,5,2,7,4,1,0};
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
	sort(a,a+10);
	for(int i=0;i<10;i++)
		cout<<a[i]<<endl;
 	return 0;
}
例二
通过上面的例子,会产生疑问:要实现从大到小的排序怎么办?
 这就如前文所说需要在sort()函数里的第三个参数里做文章了,告诉程序我要从大到小排序!
需要加入一个比较函数 compare(),此函数的实现过程是这样的
bool compare(int a,int b)
{
 return a>b;
}
这就是告诉程序要实现从大到小的排序的方法!
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(int a,int b)
{
	return a>b;
}
int main()
{
	int a[10]={9,6,3,8,5,2,7,4,1,0};
	for(int i=0;i<10;i++)
		cout<<a[i]<<endl;
	sort(a,a+10,compare);//在这里就不需要对compare函数传入参数了
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	return 0;
}
例三:
sort函数的第三个参数可以用这样的语句来说明排序原则
less<数据类型>()//从小到大排序
greater<数据类型>()//从大到小排序
结合本例子,这样的就可以完成你想要的任何一种排序原则了

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 	int a[10]={9,6,3,8,5,2,7,4,1,0};
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
	sort(a,a+10,less<int>());
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 	int a[10]={9,6,3,8,5,2,7,4,1,0};
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	sort(a,a+10,greater<int>());
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	return 0;
}
例四:利用sort函数还可以实现对字符的排序,排序方法大同小异
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 	char a[11]="asdfghjklk";
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	sort(a,a+10,greater<char>());
 	for(int i=0;i<10;i++)
 		cout<<a[i]<<endl;
 	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值