首页 > 其他分享 >全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用技巧)

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用技巧)

时间:2025-01-19 23:31:54浏览次数:3  
标签:信息学 输出 int 信奥赛 样例 备考 数组 编号 数位

二、一维数组应用技巧2:打标记

实战训练1—开关灯

问题描述:

有 M个从1到M依次编号的人参加一项游戏。将K 盏从1到K依次编号的灯(K和M均为正整数,M≤K≤5000)进行一系列的熄灭与打开的操作,游戏开始时均处于亮灯的状态;第一个人(1号)将灯全部熄灭;第二个人(2号)将编号为2的倍数的灯做相反处理(即将打开的灯熄灭,将熄灭的灯打开);第三个人( 3号)将编号为3的倍数的灯做相反处理;依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

输入格式:

输入共一行,包含两个正整数K和M,以单个空格隔开。

输出格式:

输出共一行,顺次输出关闭的灯的编号,其间用逗号间隔。

输入输出样例:

输入样例1

输出样例1

10 10 

1,4,9

输入样例2

输出样例2

20 30

1,4,9,16

问题分析:

根据题意,可以采用打标记的思想来解决此问题,首先定义一个布尔类型数组,数组元素为0表示灯处于亮的状态,1为灯处于熄灭的状态,起始值都为0,这里需要注意由于灯的编号从1到k,所以数组元素在初始时,从下标为1开始;其次来模拟操作的过程,总共m次操作,每次操作将所有是编号倍数的灯执行相反操作,这里使用嵌套循环来实现,外层循环表示m次操作,内层循环遍历一遍灯,将编号是外层循环变量的倍数,则执行相反操作;最后对熄灭的灯进行统计并输出,需要注意除了最后一盏灯,其余灯之间需要用逗号隔开。具体代码如下所示:

#include<bits/stdc++.h>
using namespace std;
int main(){
	const int MAXLEN =5005;//定义常变量的值为5005 
	int k,m;//定义灯的数量变量k和操作数变量m 
	scanf("%d%d",&k,&m);//输入k和m的值 
	bool a[MAXLEN];//定义长度为MAXLEN的布尔类型数组a 
	memset(a+1,0,k*sizeof(bool));//将1到k的初始值设置为0,表示所有的灯都开着,1表示灯关闭 
	int sum=0;//记录关闭灯的数量和 
	for(int i=1;i<=m;i++){//进行m次操作 
		for(int j=1;j<=k;j++){//对于每次操作,依据人的编号,对编号的倍数执行相关的操作 
			if(j%i==0){//查看当前灯j是否为编号i的整数倍 
				a[j]=!a[j];//对灯执行相反操作 
			}
		}
	}
	for(int j=1;j<=k;j++){//依次遍历k盏灯 
		if(a[j]){//灯如果是熄灭的状态 
			sum++;//数量加1 
		}
	}
	//在输出时,灯编号需要用逗号隔开,最后一盏灯不需要逗号,所以使用一个临时变量tmpsum来记录输出了多少盏关闭的灯 
	int tmpsum=0;
	for(int j=1;j<=k;j++){
		if(a[j]){//灯关闭,则输出该盏灯 
			tmpsum++;
			printf("%d",j);//输出灯编号 
			if(tmpsum<sum){//如果没有达到sum,则不是最后一盏关闭的灯,输出逗号 
				printf(",");
			}
		}
	}
	return 0;
} 

三、循环应用技巧3:巧用数组下标,实现计数功能

实战训练2—数字统计

问题描述:

在[l,r]范围内的整数中,每个整数各个数位上每个数字一共出现过多少次?例如,129~137:129,130,131,132,133,134,135,136,137。统计后发现:“0”出现了1次,“1”出现了10次,“2”出现了2次,“3”出现了9次,“4”出现了1次,“5”出现了1次,“6”出现了1次,“7”出现了1次,“8”出现了0次,“9”出现了1次。

输入格式:

输入共一行,包含两个整数M和N,并用空格分隔开来。

输出格式:

输出共一行,包含十个整数并用空格分开,分别表示数码 0,1,2,… ,9 在序列中出现的次数。

输入输出样例:

输入样例1

输出样例1

101 120

11 32 3 2 2 2 2 2 2 2

输入样例2

输出样例2

219 225

1 2 14 1 1 1 0 0 0 1

问题分析:

根据题意,需要依次分离[l,r]范围内每个整数的各个数位,用数组统计分离出来的数字(0~9)的个数,数组的下标表示出现的数字,数组元素表示该数字出现的次数,即累计“数组下标对应的数字”出现的次数。需要注意对于[l,r]范围内的整数依次进行分离时,用循环变量i来表示这个整数,首先需要将i赋值给一个临时变量tmp,然后再对 tmp进行数位分离。程序中不能直接对数 i 进行数位分离。原因在于数 i 除了有表示区间数的意义外,还在循环控制中起到一定作用,如果直接对 i 进行数位分离,会使得 i 的值变为0,造成程序运行错误。所以枚举区间的数进行数位分离时,需要一个临时变量tmp,存储待分离的数。通过取模运算将得到数的个位,通过整除运算将该数的个位去掉,如此反复运算,直至该数变为0,数位分离结束。所有数字统计完毕后,循环输出0~9各个整数累计的个数。具体程序代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int l,r,a[10];//定义整数的取值范围变量l和r,其次定义数字出现的数组a,长度为10的整型数组 
    memset(a,0,sizeof(a));//起始时,所有数字出现的次数为0,为数组元素全部赋值为0 
    scanf("%d%d",&l,&r);//输入l和r 
    for(int i=l;i<=r;i++){//依次列举l和r范围内的所有整数 
        int tmp=i;//将整数i赋值给临时变量tmp 
        while(tmp){//tmp不为0 
            a[tmp%10]++;//分离最后一个数位,并将该数位出现的次数加1 
            tmp=tmp/10;//移除最后一个数位 
        }
    }
    for(int i=0;i<10;i++){//依次输出每个数字出现的次数 
        printf("%d ",a[i]);
    }
    return 0;
}

标签:信息学,输出,int,信奥赛,样例,备考,数组,编号,数位
From: https://blog.csdn.net/ALISHENGYA/article/details/145249817

相关文章

  • 奥运奖牌计数(信息学奥赛一本通-1064)
    【题目描述】2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目。输出4个整数,为A国所获得的金、银、铜牌总数及总奖牌......
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用二)
    实战训练1—统计相同的数问题描述:在一次实验中产生了n个数据,现在统计这n个数据中与指定数字m相同的个数,请编程实现。输入格式:输入共三行:第一行为一个整数n,表示整数序列的长度(n<=100);第二行为n个整数,整数之间以一个空格分开;第三行包含一个整数,表示指定的数字m。输出格式:输......
  • 信息学奥赛一本通 1104:计算书费
    有点傻的方法​#include<bits/stdc++.h>usingnamespacestd;intmain(){doublea,b,c,d,e,f,g,h,j,k,res; cin>>a>>b>>c>>d>>e>>f>>g>>h>>j>>k; a=a*28.9; b=b*32.7; c=c*45.6; d=d*78; e=e*35;......
  • 【西南石油大学电气信息学院主办,EI检索稳定 | SPIE (ISSN: 0277-786X)出版】2025年计
    2025年计算机视觉研究进展与应用国际学术会议(ACVRA2025)2025InternationalConferenceonAdvancesinComputerVisionResearchandApplications2025年2月28-3月2日广州会议官网:www.acvra.org【更多详情】EI检索稳定| 西南石油大学电气信息学院主讲嘉宾:孟......
  • 信息学奥赛考试大纲之CSP-J信息学奥赛考试大纲(入门级)
    信息学奥赛考试大纲CSP-J信息学奥赛考试大纲(入门级)1.计算机基础与编程环境2.C++程序设计2.1程序基本概念2.2基本数据类型2.3程序基本语句2.4基本运算2.5数学库常用函数2.6结构化程序设计2.7数组2.8字符串的处理2.9函数与递归2.10结构体与联合体2.11指针类型2.12文件及基本......
  • 关于我怎样备考期末考试
    我在b站上找了很多的视频,然后最后决定用前后端分离的方式写java期末1idea后端datasourcesanddrivers连接数据库1.复制粘贴controller一般后面调试还要调2.a.写一个实体类(数据库:is_publish,实体类:isPublish)(实体类:ReadingProposal)b.extend下面写一个拓展查询类,…dto,需......
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)
    到目前为止,所有的训练题目中给出的输入数据个数是确定的,但是有时候输入数据个数不确定,这种情况下,需要不断读取数据直到没有新的输入数据为止,那么C++是如何判断出读到文件末尾(或者没有新的输入)了呢?在C++中使用"EOF"(endoffile)来实现,代表文件(file)或者标准输入(stdin)的结尾,读入语......
  • 【2025年|国际会议推荐】方向涉及人工智能、通信工程、控制工程、生物信息学、智能计
    【2025年1|国际会议推荐】方向涉及人工智能、通信工程、控制工程、生物信息学、智能计算、能源、自动化、大数据、管理学、信息化教育、计算机技术…【2025年|国际会议推荐】方向涉及人工智能、通信工程、控制工程、生物信息学、智能计算、能源、自动化、大数据、管理学、......
  • 信息学奥赛一本通汇总
    「基础算法」第1章递推算法博客链接总结:一般有具体的情境,可以通过直接的模拟转移过程来实现递推,T2,T4,T9找到已知状态和所求状态的差别和联系,想办法将所求转化为已知进行转移,一般要用到分讨,T1,T3根据题目将问题转化,增维,然后转化后进行递推,T8第2章贪心算法博客链接总结:......
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环语句)
    在C++编程中,循环结构是控制程序流程的重要工具之一。前面介绍了for循环相关内容,对于for循环来讲,可以明确循环变量的初始值和终值,即可以确定循环的次数,对于循环次数不确定的情况,可以使用while循环来解决,while循环作为最基本的循环结构之一,允许代码在满足特定条件时重复执行。本......