996模拟赛总结 2021.12

【翻到了以前写的博客的草稿。。。日期大概在2021年12月份左右 2022.3.29】

 

大概就是前期比较兴奋,中间比较渺茫,结尾比较惨淡。。。。。。。

就这么个过程

 

random之前做过,直接AC,不说了;

1、明明的随机数(Noip2006)

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

【输入文件】 输入文件 random.in 有 2 行, 第 1 行为 1 个正整数,表示所生成的随机数的个数:N 第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。

【输出文件】 输出文件 random.out 也是 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

 

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int s[1001] = {};
	int n,m,p = 0,j = 0;
	cin>>n;
	for(int i = 1;i <= n;i++){
	scanf("%d",&m);
	s[m] = 1;
	if(m > p){
		p = m;
	}
}
for(int i = 1;i<=p;i++){
	if(s[i] == 1){
		j++;
	}
}
printf("%d\n",j);
for(int i = 1;i<=p;i++){
	if(s[i] == 1){
		printf("%d ",i);
	}
}
	return 0;
}


carry之前也做过 但是之前只是输出对了 数组大小不对 以为自己AC了 今天和昨天写的一样但是数组开对了 发现输出不对 说明写法不对 大概就是一个冒泡排序(带特判)

2、车厢重组(carry)
【问题描述】 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。
一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。
于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。
他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
【输入文件】 输入文件有两行数据,第一行是车厢总数 N(不大于 10000),第二行是 N 个不同的数表示初始的车厢顺序。
【输出文件】 一个数据,是最少的旋转次数。
【输入样例】 4 4 3 2 1
【输出样例】6

#include<bits/stdc++.h>
using namespace std;
int s[10001];
int main(){
    int n,a = 0,k;
    cin>>n;
    for(int i = 0;i<n;i++){
        scanf("%d",&s[i]);
    }
    for(int i =0;i<n;i++){
    int    k = 1;
        for(int j = 0;j<n-1;j++){
            if(s[j]>s[j+1]){
                swap(s[j],s[j+1]);
                k = 0;
                a++;
            }
        }
        if(k){
            break;
        }
    }
    cout<<a;
    return 0;
}
masses卡了好长时间 最后写了0分 最开始是因为函数写的不对 后来大概就是出现两次众数时第二个会把第一个覆盖。。。
3、众数(masses)
【问题描述】 由文件给出N个1到30000 间无序数正整数,其中 1≤N≤10000,同一个正整数可能会出现多次,出现次数最多的整数称为众数。
求出它的众数及它出现的次数。
【输入格式】 输入文件第一行是正整数的个数 N,第二行开始为 N 个正整数。
【输出格式】 输出文件有若干行,每行两个数,第 1 个是众数,第 2 个是众数出现的次数。
【输入样例】 12 2 4 2 3 2 5 3 7 2 3 4 3
【输出样例】 2 4 3 4


knumber还比较简单,和第一题很像,但是第一次交的时候忘了写NO RESULT(>_<)。。
4、第 k 小整数(knumber)
【问题描述】 现有 n 个正整数,n≤10000,要求出这 n 个正整数中的第 k 个最小整数(相同大小的整数只计算一次),k≤1000,正整数均小于 30000。
【输入格式】 第一行为 n 和 k,第二行开始为 n 个正整数的值,整数间用空格隔开。
【输出格式】 第 k 个最小整数的值;若无解,则输出“NO RESULT”。
【输入样例】 10 3 1 3 3 7 2 5 1 2 4 6
【输出样例】 3
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int s[10001] = {};
    int m[10001] = {};
	int n,x,k,p = 0,j = 0,a = 0;
	cin>>n>>k;
	for(int i = 1;i <= n;i++){
	scanf("%d",&x);
	s[x] = 1;
	if(x > p){
		p = x;
	}
}
for(int i = 1;i<=p;i++){
	if(s[i] == 1){
		a++;
		m[a] = i;
	}
}
bool b = m[k];
if(b == true){
printf("%d",m[k]);
}
else{
	printf("NO RESULT");
}
	return 0;
}
secret上手的时候感觉要用结构体 但题读明白之后发现数组Sort一下就搞定了
不过写这个的时候有个小插曲 第一次试样例的时候卡了一下 原因是循环次数写多了 数组含量没那么大 所以数组下标为空 输出无效
5、军事机密(secret)
【问题描述】 军方截获的信息由 n(n<=30000)个数字组成,因为是敌国的高端秘密,所以一时不能破获。
最原始的想法就是对这 n 个数进行从小到大排序,每个数都对应一个序号,然后对第 i 个是什么数感兴趣,现在要求编程完成。
【输入格式】 第一行 n,接着是 n 个截获的数字,接着一行是数字 k,接着是 k 行要输出数的序号。
【输出格式】 k 行序号对应的数字。
【输入样例】 5 121 1 126 123 7 3 2 4 3
【输出样例】 7 123 12

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a<b;
}

int main(){
	int n,k;
	int c[30001];
	cin>>n;
	int d[n+1];
	for(int i = 1;i<=n;i++){
		scanf("%d",&c[i]);
	}
	cin>>k;
	for(int i = 1;i<=k;i++){
		scanf("%d",&d[i]);
	}
	sort(c+1,c+1+n,cmp);
	for(int i = 1;i<=k;i++){
		printf("%d\n",c[d[i]]);
	}
	return 0;
}
posted @ 2022-03-29 17:14  November&&Rain  阅读(129)  评论(0)    收藏  举报