信息学奥赛初赛天天练-56-CSP-J2019完善程序2-双关键字排序、计数排序、前缀和、前缀自增、后缀自增、数组下标自增

news2024/9/24 13:14:26

PDF文档公众号回复关键字:20240805

在这里插入图片描述

1 完善程序 (单选题 ,每小题3分,共30分)

计数排序

计数排序是一个广泛使用的排序方法。下面的程序使用双关键字计数排序,将 n 对 10000以内的整数,从小到大排序。

例如有三对整数 (3,4)、(2,4)、(3,3),那么排序之后应该是 (2,4)、(3,3)、(3,4) 。

输入第一行为 n,接下来 n 行,第 i 行有两个数 a[i] 和 b[i],分别表示第 i 对整数的第一关键字和第二关键字。

从小到大排序后输出。

数据范围 1<n<10^7,1<a[i],b[i]< 10^4。

提示:应先对第二关键字排序,再对第一关键字排序。数组 ord[] 存储第二关键字排序的结果,数组 res[] 存储双关键字排序的结果。

试补全程序。

01 #include <cstdio>
02 #include <cstring>
03 using namespace std;
04 const int maxn = 10000000;
05 const int maxs = 10000;
06 
07 int n;
08 unsigned a[maxn], b[maxn],res[maxn], ord[maxn];
09 unsigned cnt[maxs + 1];
10 int main() {
11     scanf("%d", &n);
12     for (int i = 0; i < n; ++i) 
13         scanf("%d%d", &a[i], &b[i]);
14     memset(cnt, 0, sizeof(cnt));
15     for (int i = 0; i < n; ++i)
16         ①; // 利用 cnt 数组统计数量
17     for (int i = 0; i < maxs; ++i) 
18         cnt[i + 1] += cnt[i];
19     for (int i = 0; i < n; ++i)
20         ②; // 记录初步排序结果
21     memset(cnt, 0, sizeof(cnt));
22     for (int i = 0; i < n; ++i)
23         ③; // 利用 cnt 数组统计数量
24     for (int i = 0; i < maxs; ++i)
25         cnt[i + 1] += cnt[i];
26     for (int i = n - 1; i >= 0; --i)
27         ④ // 记录最终排序结果
28     for (int i = 0; i < n; i++)
29         printf("%d %d", ⑤);
30 
31     return 0;
32}

1 ①处应填( )[3分]

A ++cnt [i]

B ++cnt[b[i]]

C ++cnt[a[i] * maxs + b[i]]

D ++cnt[a[i]]

2 ②处应填( )[3分]

A ord[–cnt[a[i]]] = i

B ord[–cnt[b[i]]] = a[i]

C ord[–cnt[a[i]]] = b[i]

D ord[–cnt[b[i]]] = i

3 ③处应填( )[3分]

A ++cnt[b[i]]

B ++cnt[a[i] * maxs + b[i]]

C ++cnt[a[i]]

D ++cnt [i]

4.④处应填( )[3分]

A res[–cnt[a[ord[i]]]] = ord[i]

B res[–cnt[b[ord[i]]]] = ord[i]

C res[–cnt[b[i]]] = ord[i]

D res[–cnt[a[i]]] = ord[i]

5 ⑤处应填( )[3分]

A a[i], b[i]

B a[res[i]], b[res[i]]

C a[ord[res[i]]]j b[ord[res[i]]]

D a[res[ord[i]]]j b[res[ord[i]]]

2 相关知识点

1) 计数排序

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,具体思路为
统计相同元素出现次数
根据统计的结果将序列回收到原来的序列中

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

int main(){
	int a[10]={3,4,2,7,5,4,3,3,3,5};
	int cnt[7]={0};//cnt数组记录对应下标出现次数 
	for(int i=0;i<10;i++){
		cnt[a[i]]++;
	}
	
	for(int i=0;i<=7;i++){//枚举对应范围的数 从最小到最大,本示例从0~7即可 
		while(cnt[i]>0){//一个数字出现多次时,cnt[i]为对应的数为出现几次
			cout<<i<<" ";
			cnt[i]--;
		}
	}
	
	return 0;
}

/*
输出
2 3 3 3 3 4 4 5 5 7 
*/ 

2) 前缀和

前缀和就是数组的前i项之和

s[1]=a[1]

s[2]=a[1]+a[2]

s[3]=a[1]+a[2]+a[3]

s[4]=a[1]+a[2]+a[3]+a[4]

s[5]=a[1]+a[2]+a[3]+a[4]+a[5]

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

int main(){
	int a[10]={1,2,3,4,5,6,7,8,9,10};
	int s[10]={0};//存放前i项和数组 
	int sum=0;//累加变量 
	for(int i=0;i<10;i++){
		sum+=a[i];
		s[i]+=sum;
	}
	for(int i=0;i<10;i++){
		cout<<s[i]<<" ";
	}
	return 0;
}

/*
输出
1 3 6 10 15 21 28 36 45 55 
*/

3) 计数排序与前缀和

计数排序和前缀和结合,把通过一个排序数组记录待排序数组的下标

#include<bits/stdc++.h>
using namespace std;
/*
  计数排序和前缀和结合,可以和原数组的数一一对应 
*/ 
int main(){
	int a[10]={3,4,2,7,5,4,3,3,3,5};
	int b[10]={0};//从小到大记录对应数在a数组的下标 
	int cnt[15]={0};//cnt数组记录对应下标出现次数 
	for(int i=0;i<10;i++){//累加a数组每个数出现次数 
		cnt[a[i]]++;
	}//0 0 1 4 2 2 0 1 0 0
	
	for(int i=0;i<15;i++){//前缀和计算 为a中每个数计算一个对应下标 
		cnt[i+1]+=cnt[i];
	}//0 0 1 5 7 9 9 10 10 10

	for(int i=0;i<10;i++){//把a数组数放入b数组通过下标排序,值为a数组的下标 
		b[--cnt[a[i]]]=i;
	}//2 3 3 3 3 4 4 5 5 7  
	return 0;
}

/*
输出
2 3 3 3 3 4 4 5 5 7 
*/ 

4) 后缀自增和前缀自增

前缀自增 ++i,后缀自增i++

i++只有i变量加+1,i++的表达式不加+1

++i则变量加1,++i表达式加1

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

int main(){
	int a[5]={0,1,2,3,4};
	int i=0;
	cout<<a[i++]<<endl;//i++表达式不加,输出a[0]的值,对应为0 
	i=0;
	cout<<a[++i]<<endl;//++i表达式加1,输出a[1]的值,对应为1 
	i=0;
	i++;
	cout<<a[i]<<endl;//i++后i变量加1, 出a[1]的值,对应为1 
	i=0;
	++i;
	cout<<a[i]<<endl;//++i后i变量加1, 出a[1]的值,对应为1 
	return 0;
}

3 思路分析

1 ①处应填( B )[3分]

A ++cnt [i]

B ++cnt[b[i]]

C ++cnt[a[i] * maxs + b[i]]

D ++cnt[a[i]]

分析

通过cnt数组对b数组进行排序,如果有重复会累加到cnt当前元素中
例如
int b[3]={4,4,3}
cnt数组的值如下图

2 ②处应填( D )[3分]

A ord[–cnt[a[i]]] = i

B ord[–cnt[b[i]]] = a[i]

C ord[–cnt[a[i]]] = b[i]

D ord[–cnt[b[i]]] = i

分析

在ord数组中,从小到大记录b数组的位置
ord[0]=2 对应b[2]=3
ord[1]=1 对应b[1]=4
ord[2]=0 对应b[0]=4

3 ③处应填( C )[3分]

A ++cnt[b[i]]

B ++cnt[a[i] * maxs + b[i]]

C ++cnt[a[i]]

D ++cnt [i]

分析

进行这里之前,对cnt数组进行了清0
21     memset(cnt, 0, sizeof(cnt));

通过cnt数组对a数组进行排序,如果有重复会累加到cnt当前元素中
例如
int a[3]={3,2,3}
cnt数组的值如下图

4.④处应填( A )[3分]

A res[–cnt[a[ord[i]]]] = ord[i]

B res[–cnt[b[ord[i]]]] = ord[i]

C res[–cnt[b[i]]] = ord[i]

D res[–cnt[a[i]]] = ord[i]

分析

在res数组中,从小到大记录b数组的下标,b数组下标和a数组下标对应
    
a[ord[i]] ord[]已经对b进行了排序,n-1~0 从大到小找对应的a
cnt[a[ord[i]]] 找到a后,以下标放入res数组,进行计数排序

res[--cnt[a[ord[i]]]] = ord[i] --用ord[i]赋值,记录res[]存放的b数组下标

例如
int a[3]={3,2,3}
int b[3]={4,4,3}
res[--cnt[a[ord[2]]]]= res[--cnt[a[0]]]=res[--cnt[3]]=res[2]
=ord[2]=0
res[--cnt[a[ord[1]]]]= res[--cnt[a[1]]]=res[--cnt[2]]=res[0]
=ord[1]=1
res[--cnt[a[ord[0]]]]= res[--cnt[a[2]]]=res[--cnt[3]]=res[1]
=ord[0]=2

26     for (int i = n - 1; i >= 0; --i)
因为ord[]是从小到大,从n-1~0,从大到小循环,a相同时,取出的第1次取出的下标大,可以对应
如果从0~n-1循环,正好相反,导致b排序不对

5 ⑤处应填( B )[3分]

A a[i], b[i]

B a[res[i]], b[res[i]]

C a[ord[res[i]]]j b[ord[res[i]]]

D a[res[ord[i]]]j b[res[ord[i]]]

分析

res[]对a和b数组进行计数排序,按a数组从小到大,如果a相同按b数组从小到大
res[]数组的值分别位a和b数组的下标,a和b数组下标对应
所以按res下标从小到大输出a和b的值即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

标准IO及相关练习

标准IO 能够将指定的数据写入指定的文件中的操作&#xff08;通过文件指针去访问指定的文件&#xff1a;FILE*&#xff09;&#xff0c;标注IO只提供写入或者读取操作&#xff0c;不提供删除文件中的内容&#xff0c;想要删除文件&#xff0c;则需要自己写逻辑来实现。 文件指…

【LeetCode Cookbook(C++ 描述)】一刷哈希表(Hash Table)(下)

目录 LeetCode #349&#xff1a;Intersection of Two Arrays 两个数组的交集LeetCode #383&#xff1a;Ransom Note 赎金信LeetCode #454&#xff1a;4Sum II - 四数相加 II 本系列文章仅是 GitHub 大神 halfrost 的刷题笔记 《LeetCode Cookbook》的提纲以及示例、题集的 C转化…

办公楼子母钟系统,不止显示时间,还可以做临时告示牌

在现代办公环境中&#xff0c;时间管理对于提高工作效率至关重要。传统的时钟往往只能提供最基本的时间显示功能&#xff0c;而在快节奏的办公楼里&#xff0c;一个既能准确显示时间又能发布紧急通知的系统显得尤为必要。本文将介绍办公楼子母钟系统的独特优势及其在不同场景中…

TOOL使用

一、代码生成器 1.页面代码生成&#xff08;前端&#xff09; 生成后会在前端&#xff08;pc&#xff09;代码中看得到代码&#xff0c;可在此做二次开发&#xff1a; 代码生成器中新建不同模块&#xff0c;对应着modules文件夹下文件夹—>生成代码时&#xff0c;选择对应…

50etf期权怎么可以买跌做空吗?

50ETF期权可以做买方也可以做卖方&#xff0c;并且50ETF期权还能够买涨买跌双向交易&#xff0c;50ETF期权可以看涨期权和看跌期权&#xff0c;所以50ETF期权是可以买跌做空的&#xff0c;并且50ETF期权是很适合进行做空操作的&#xff0c;下文为大家介绍50etf期权怎么可以买跌…

如何将.bin文件,hex方式查看里面数据。以自己需要的任何长度来分割

liunux环境编译命令&#xff1a; gcc test.cpp -o testtest.cpp 文件&#xff1a; instring 为需要被分割的文件&#xff1a; outstring 为分割后的文件&#xff1a; #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.…

NSF共享目录未授权访问

NSF共享目录未授权访问 Network File System(NFS)&#xff0c;是由SUN公司研制的UNIX表示层协议(pressentation layer protocol)&#xff0c;能使使用者访问网络上别处的文件就像在使用自己的计算机一样。服务器在启用nfs服务以后&#xff0c;由于fs服务未限制对外访问&#x…

同步时钟系统,防水效果出色,无惧户外雨天环境

在我们的日常生活和工作中&#xff0c;时钟是不可或缺的存在。然而&#xff0c;传统时钟在使用过程中逐渐暴露出一些问题。 传统时钟通常依靠机械结构或简单的电子元件来保持时间的准确性&#xff0c;这使得它们容易受到外界因素的干扰。例如&#xff0c;温度的变化可能导致机芯…

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验,强大的不仅仅只是配置

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验&#xff0c;强大的不仅仅只是配置 哈喽小伙伴们好&#xff0c;我是Stark-C~ 在去年10月份新品发布会的时候&#xff0c;极空间推出了堪称私有云性能巅峰的『极空间Z423』。作为当前民用级NAS配置的天花板&#xff0c;极空间…

安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?

安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、GIS地图、轨迹跟踪、平台级联等视频能力。 用户描述&#xff0c;设备在电子地图中可以查看到定位信息&#xff…

简单操作,轻松创作专业级电子书

在当今数字化时代&#xff0c;电子书的崛起为创作者们带来了前所未有的便利和创作自由。相较于传统印刷书籍&#xff0c;现代电子书的制作过程不再是一项复杂而耗时的任务&#xff0c;而是通过简单操作就能轻松实现的专业级创作。 但是你知道该如何创作专业级的电子书吗&#x…

STM32的FATFS文件系统移植

准备工作 本移植基于STM32HAL库&#xff0c;在开始移植之前准备好一个Cubemx、一个待移植的FATFS源码和一张文件格式为FAT32且大小小于等于32G的SD卡。本项目用的是正点原子的F103开发板。 源码下载&#xff1a;FatFs - Generic FAT Filesystem Module 移植开始 cubemx代码 此…

图片无损压缩工具都有哪些?试试这3款巨好用的压缩软件!支持在线使用

3个图片无损压缩工具推荐&#xff0c;在线免费使用 请你一定要收藏好&#xff01; 1、转转大师 推荐指数&#xff1a;⭐⭐⭐⭐⭐ 直达链接>>pdftoword.55.la 转转大师是一个专业文档转换工具&#xff0c;支持在线编辑&#xff0c;也是微软office官方中国合作伙伴&…

07.FreeRTOS列表与列表项

文章目录 07. FreeRTOS列表与列表项1. 列表和列表项的简介2. 列表相关API函数3. 代码验证 07. FreeRTOS列表与列表项 1. 列表和列表项的简介 列表的定义&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */volatile UBaseType_t uxN…

吴恩达机器学习-可选的实验室-正则化成本和梯度

目标 在本实验中&#xff0c;你将: 用正则化项扩展前面的线性和逻辑代价函数。重新运行前面添加正则化项的过拟合示例。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_overfit import overfit_example, output from lab_utils_common i…

关于vs2022项目占用空间太大的问题

之前在分享vs2022项目&#xff08;估计其它vs版本也差不多&#xff09;的时候发现项目占用空间比较大&#xff0c;即使压缩也不利于上传网盘&#xff0c;于是看了一下目录&#xff0c;发现有个隐藏的.vs目录&#xff0c;里面有个和项目同名的文件夹&#xff0c;占用着很大的空间…

⌈ 传知代码 ⌋ MSA+抑郁症模型总结(三)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

NLP——Transfromer 详解

Transformer总体架构图 输入部分&#xff1a;源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…

Liunx---批量安装服务器

目录 一、环境准备 一、环境准备 1.准备一台rhel7的主机并且打开主机图形。 2.配置好可用ip 3.做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 二、安装图形化kickstart自动安装脚本的工具 yum install system-config-kickstart ----安装图形化生…

Guitar Pro简谱怎么输入 ?如何把简谱设置到六线谱的下面?

一、Guitar Pro简谱怎么输入 简谱在音乐学习、演奏、创作和传播中都起着非常重要的作用&#xff0c;是音乐领域不可或缺的工具。吉他乐谱的制作可以使简谱&#xff0c;也可以使五线谱、六线谱等多种形式&#xff0c;这几种乐谱都可以使用Guitar Pro来完成。下面来看看Guitar Pr…