首页 > 其他分享 >P1059 [NOIP2006 普及组] 明明的随机数

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

时间:2024-02-14 12:11:27浏览次数:39  
标签:NOIP2006 stu int arr ++ 随机数 P1059 排序

1.题目介绍

[NOIP2006 普及组] 明明的随机数

题目描述

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

输入格式

输入有两行,第 \(1\) 行为 \(1\) 个正整数,表示所生成的随机数的个数 \(N\)。

第 \(2\) 行有 \(N\) 个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是两行,第 \(1\) 行为 \(1\) 个正整数 \(M\),表示不相同的随机数的个数。

第 \(2\) 行为 \(M\) 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例 #1

样例输入 #1

10
20 40 32 67 40 20 89 300 400 15

样例输出 #1

8
15 20 32 40 67 89 300 400

提示

NOIP 2006 普及组 第一题

2.题解

2.1 计数排序

思路

这里由于生成了 N个 1到1000之间的随机数(N≤100),这里的数据范围(N≤100)及值域(1-1000)都不是很大,可以使用计数排序

代码

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	int count = 0;
	cin >> n;
	vector<int> arr(1001);
	for(int i = 0; i < n; i++){
		int stu;
		scanf("%d", &stu);
		if (!arr[stu]){
			arr[stu]++;
			count++;
		}	
	}
	cout << count << endl;
	for(int i = 1; i <= 1000; i++){
		if(arr[i]) cout << i << ' ';
	}
} 

2.2 使用sort函数排序

思路

使用sort排序获得的无序集合,再在其中筛选掉重复选项,获得有序不重复集合。

代码

#include<bits/stdc++.h>
using namespace std; 

int main(){
	int n;
	cin >> n;
	vector<int> arr(n), ans;
	for(int i = 0; i < n; i++){
		scanf("%d", &arr[i]);
	}
	sort(arr.begin(), arr.end());
	ans.push_back(arr[0]);
	int curr = 0;
	for(int i = 1; i < n; i++){
		if(arr[i] != ans[curr]){
			ans.push_back(arr[i]);
			curr++;
		}
	} 
	cout << ans.size() << endl;
	for(auto it = ans.begin(); it != ans.end(); it++)
		cout << *it << ' ';
}

2.3 使用set集合存储

思路

set集合拥有自动去重并且按从小到大的顺序排列的性质

代码

#include<bits/stdc++.h>
using namespace std; 

int main(){
	int n;
	cin >> n;
	set<int> arr;
	for(int i = 0; i < n; i++){
		int tmp;
		scanf("%d", &tmp);
		arr.insert(tmp);
	}
	
	cout << arr.size() << endl;
	for(auto it = arr.begin(); it != arr.end(); it++)
		cout << *it << ' ';
}

标签:NOIP2006,stu,int,arr,++,随机数,P1059,排序
From: https://www.cnblogs.com/trmbh12/p/18015039

相关文章

  • c++生成随机数
    产生随机数的叫随机数生发器生成随机数constunsignedzseed=time(0);voidsolve(){ //随机数生发器 mt19937_64m{zseed}; //种子 rep(i,1,5) cout<<m()<<endl; return;}重排序列constunsignedzseed=time(0);mt19937_64zgen{zseed};voidsolve(){ ve......
  • 伪随机数(gcd+裴蜀定理)
    第2题   伪随机数查看测评数据信息一个生成伪随机数的函数,seed(a+1)=[seed(a)+STEP]%MOD,为了能产生0~MOD-1的所有数,需要设定合适的STEP和MOD。例如,STEP=3,MOD=5,产生0,3,1,4,2,这是正确的设定;若STEP=15,MOD=20,只能产生0,15,10,5,这是错误的设定。 输入格式 ......
  • net8 随机数类Random GetItems() 、Shuffle()方法
    1、在8中对随机数类Random提供了GetItems()方法,可以根据指定的数量在提供的一个集合中随机抽取数据项生成一个新的集合:ReadOnlySpan<string>colors=new[]{"Red","Green","Blue","Black"};string[]t1=Random.Shared.GetItems(colors,10);Console.WriteLine(......
  • 洛谷题单指南-排序-P1059 [NOIP2006 普及组] 明明的随机数
    原题链接:https://www.luogu.com.cn/problem/P1059题意解读:此题主要做两件事:排序+去重,用计数排序即可解决,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=1005;inta[N];intn;intmain(){cin>>n;intx;intcnt......
  • P1063 [NOIP2006 提高组] 能量项链
    原题链接题解1.拆环成链2.最后一颗留下来的珠子一定是的头标记一定是某个原珠子\(A\)的头标记,尾标记一定是珠子\(A\)右边n个单位的珠子的尾标记3.对任意最大值而言,最后一颗一定是某两个珠子的合并后产生的,所以我们可以在区间内断点遍历\(Code\)#include<bits/stdc++.h>usin......
  • 使用RanDom生成不重复的随机数
    首先看一下关键词的傻瓜讲解Random用法Random.Next()返回非负随机数;Random.Next(a)返回一个小于a的非负随机数Random.Next(a,b)返回一个大于a小于b的非负随机数contains用法list.Contains(a)判断列表list里是否含有a,有则返回true接下来看代码staticvoidMain(string[]args)......
  • Python NumPy 生成随机数的方法及示例
    ​ NumPy是一个强大的库,用于数值计算,包括生成各种随机数。可以使用random.rand()、random.randn()、random.randint()、random.uniform()、random.normal()和random.seed()函数方法生成随机数。本文介绍生成随机数的方法,以及相关的示例代码。1、numpy.random.rand()numpy.ra......
  • Python random模块(获取随机数)常用方法和使用例子
    random.randomrandom.random()用于生成一个0到1的随机符点数:0<=n<1.0random.uniformrandom.uniform(a,b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a>b,则生成的随机数n:a<=n<=b。如果a<b,则b<=n<=a代码如下:print(ra......
  • 短小精悍(4) - Rust操作系统随机数getrandom库介绍
    今天带来的是另一个“短小精悍”的库:getrandom。它的作用是从操作系统提供的随机数源获得一段随机数。用法getrandom的用法很简单,唯一需要了解的就是它内部的同名函数:pubfngetrandom(dest:&mut[u8])->Result<(),Error>它将会向dest中填充来自操作系统的随机数。示例:......
  • 12.27生成随机数,循环间断,数组元素访问,
     无限循环即在限制循环次数的位置为空  数组中数据建议和数组类型保持一致  0位是第一个元素 ......