普及组exp解题报告

合集下载

信息学奥赛NOIP2012普及组解题报告

信息学奥赛NOIP2012普及组解题报告

信息学奥赛NOIP2012普及组解题报告1.质因数分解(prime.cpp/c/pas)【问题描述】已知正整数n 是两个不同的质数的乘积,试求出较大的那个质数。

【输入】输入文件名为prime.in。

输入只有一行,包含一个正整数n。

【输出】输出文件名为prime.out。

输出只有一行,包含一个正整数p,即较大的那个质数。

【输入输出样例】【数据范围】对于60%的数据,6 ≤ n≤ 1000。

对于100%的数据,6 ≤n ≤2*109。

#include <stdio.h>#include <math.h>int main(){int n,i,k;scanf("%d",&n);for (i=2, k=sqrt(n) + 1;i<k;++i)if (n % i == 0){printf("%d\n", n / i);break;}return 0;}第二题寻宝[题目]传说很遥远的藏宝楼顶层藏着诱人的宝藏。

小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。

说明书的内容如下:藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。

除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,…,M-1。

其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。

每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k号房间。

比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2个有楼梯的房间,从该房间上楼。

如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。

寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。

NOIP2023普及组解题报告

NOIP2023普及组解题报告

NOIP2023普及组解题报告1. 题目背景NOIP(全国青少年信息学奥林匹克竞赛)是中国最重要的信息学竞赛之一,旨在选拔出优秀的信息学人才。

本文将解析NOIP2023普及组的题目并给出详细的解题思路。

2. 题目描述题目一:数找数给定一组数字,从中选择出两个数字,它们的和正好等于给定的目标数。

假设给定的数字集合中只有一组解。

请编写程序找出这两个数字并输出其下标。

输入: - 第一行为一个整数n,表示数字的个数。

- 第二行为n个以空格分隔的整数,表示一组数字。

- 第三行为一个整数target,表示目标数。

输出: - 输出两个整数i和j,表示所选数字的下标(从1开始计数,索引间以空格分隔)。

题目二:矩阵变换给定一个大小为n x m的矩阵,请编写程序将其顺时针旋转90度。

输入: - 第一行为两个正整数n和m,表示矩阵的行数和列数。

- 接下来的n行为矩阵的元素,每行包含m个以空格分隔的数字。

输出: - 输出顺时针旋转后的矩阵,每行包含n个以空格分隔的数字。

题目三:字符串缩写给定一个字符串,请编写程序将其缩写。

输入: - 输入为一行字符串,长度不超过100个字符。

- 字符串中只包含英文小写字母。

输出: - 输出为缩写后的字符串。

3. 解题思路题目一:数找数本题通过使用两个指针,一个指向数组开始,一个指向数组末尾,不断向内扩展判断两个指针对应的数字之和与目标数的大小关系,直到找到解为止。

具体步骤如下:1.定义两个指针left和right,初始时分别指向数组的第一个和最后一个元素。

2.循环执行以下步骤:–如果left和right对应的数字之和等于目标数,则输出left+1和right+1,结束循环。

–如果left和right对应的数字之和大于目标数,则将right 向左移动一位。

–如果left和right对应的数字之和小于目标数,则将left 向右移动一位。

题目二:矩阵变换本题的思路是将原矩阵逐个读入,并按照顺时针旋转的规律重新输出。

2019年全国青少年信息学(计算机)奥林匹克分区联赛普及组复赛试题

2019年全国青少年信息学(计算机)奥林匹克分区联赛普及组复赛试题

NOIP2002普及组解题报告题一:级数求和[问题描述]::Sn=1+1/2+1/3+…+1/n。

显然对于任意一个整数K,当n足够大的时候,Sn大于K。

现给出一个整数K〔1<=K<=15〕,要求计算出一个最小的n,使得Sn>K[问题分析]:这道题目非常简单,题目的意思已经把该题的算法描述得再清楚不过了,初始时Sn=0,n=0,然后每次循环n←n+1,Sn←Sn+1/n,,直到Sn大于K,最后输出K。

另外实型(Real 是最慢的,建议用Extended)的运算速度不是很快,而K为1~15之间的整数,所以最后可以交一张表〔常量数组〕,以达到最好的效果[参考程序]:programc1;varK:Byte;n:Longint;Sn:Extended;beginReadln(K);Sn:=0;n:=0;RepeatInc(n);Sn:=Sn+1/n;UntilSn>k;Writeln(n);end.题二:选数[问题描述]:n〔1<=n<=20〕个整数x1,x2,…,xn〔1<=xi<=5000000〕,以及一个整数k〔k<n〕。

从n 个整数中任选k个整数相加,可分别得到一系列的和。

现在,要求你计算出和为素数共有多少种。

[问题分析]:此题动态规划无从下手,也无数学公式可寻,看来只能搜索〔组合的生成算法〕,其实1<=n<=20这个约束条件也暗示我们此题搜索是有希望的,组合的生成可用简单的DFS来实现,既搜索这k个整数在原数列中的位置,由于组合不同于排列,与这k个数的排列顺序无关,所以我们可以令a[I]<a[I+1]〔a[I]表示第I个数在原数列中的位置〕,这个组合生成算法的复杂度大约为C(n,k),下面给出递归搜索算法的框架:接下来的问题就是判断素数,判断一个整数P(P>1)是否为素数最简单的方法就是看是否存在一个素数a(a<=sqrt(P))是P的约数,如果不存在,该数就为素数,由于在此题中1<=xi<=5000000,n<=20,所以要判断的数P不会超过100000000,sqrt(p)<=10000,因此,为了加快速度,我们可以用筛选法将2…10000之间的素数保存到一个数组里〔共1229个〕,这样速度估计将提高5~6倍。

NOIP2017 解题报告 ZYH

NOIP2017  解题报告 ZYH

NOIP2017解题报告一、成绩(score)这是一道送分题。

题目明确规定A、B、C都是10的正数倍。

所以我们可以将读入进来的a、b、c都先整除10,再分别将a*2,b*3,c*5,然后相加,就是最后的答案。

且结果可以保存在longint类型中。

代码如下:vara,b,c,sum:longint;beginassign(input,'score.in');reset(input);assign(output,'score.out');rewrite(output);readln(a,b,c);sum:=a div10*2+b div10*3+c div10*5;writeln(sum);close(input);close(output);end.但倘若题目没有说明A、B、C都是10的正数倍,那么我们就将a*0.2,b*0.3,c*0.5,然后相加。

但这一次结果需存在实型中。

二、图书管理员(librarian)这是一道简单题。

其实吧,本套试卷我们要认真阅读数据规模,总能发现一些微妙的细节。

例如本题,所有的图书编码和需求码均不超过10,000,000完全可以用longint存的(那不就很棒棒了~~)对于读入的每一个需求码,我们都去循环一遍,先判断当前的这本书符不符合需求,但怎么判断呢?数据会告诉我们需求码的长度k,也就是说我们要判断当前书码的后k位是否等于需求码。

哈哈哈,没错,只要用书码mod(10的k次方)即可。

如果相等,那么进行判断取小(因为题目君说要最小的啦~~)。

所以这里如果使用了快排从小到大,那么当你找到第一个满足要求的书码就是答案。

当然不用也可以,时间复杂度为O(nq),1000,000不会炸。

话不多说,代码如下:varn,m,i,j,x,y,sum,min:longint;a:array[0..1000]of longint;procedure f(l,r:longint);varx,y,mid,t:longint;beginx:=l;y:=r;mid:=a[(l+r)div2];repeatwhile a[x]<mid do inc(x);while a[y]>mid do dec(y);if x<=y thenbegint:=a[x];a[x]:=a[y];a[y]:=t;inc(x);dec(y);end;until x>y;if l<y then f(l,y);if x<r then f(x,r);end;beginassign(input,'librarian.in');reset(input);assign(output,'librarian.out');rewrite(output);readln(n,m);for i:=1to n do readln(a[i]);f(1,n);for i:=1to m dobeginreadln(x,y);sum:=1;for j:=1to x do sum:=sum*10;min:=maxlongint;for j:=1to n doif a[j]mod sum=y then begin min:=a[j];break;end;if min=maxlongint then writeln(-1)else writeln(min);end;close(input);close(output);end.但倘若我们的需求码和编码是一些很大很大的数(longint无法承受)时,最最高大上的字符串就闪亮登场了(蹬蹬蹬,天空一声巨响,字符串闪亮登场)。

NOIP2014 普及组 解题报告

NOIP2014 普及组 解题报告

f[i,j]:=min{f[i-1,k]+|a[j]-a[k]|} (i≤k<j)
这里,f 是状态数组,a 储存原始序列。注意,所有的加数都在 min 的大括号中。这是一个时间 复杂度为 O(n3)的二维 DP。有了这个方程,我们再回到原问题。思考以后发现,要想直接把这个方 程升级到二维是十分困难的。注意到“1≤n,m≤16”这个数据范围,想到,可不可以一半搜索一半 DP 呢?答案是肯定的。我们可以任选行或列进行搜索(以搜索行为例),每次穷搜到的结果是一个有 r 个元素的行标序列。接下来,对于每一列 j,我们就可以将 a[ik,j](k 表示所有当前被搜中的行) 作为一个整体。对于在一维序列中的代价“|a[j]-a[k]|”,在二维矩阵中可以把它分解为上下两 个元素的“纵差”和左右两个元素的“横差”,在每次 DP 之前进行初始化。这样就把二维矩阵压缩 成了一维序列,可以应用刚才的状态转移方程了——当然还要变换一下:
assign(output,'count.out'); rewrite(output); readln(n); for i:=1 to n do read(a[i]); fillchar(b,sizeof(b),false); for i:=1 to n-1 do for j:=i+1 to n do b[a[i]+a[j]]:=true; ans:=0; for i:=1 to n do if b[a[i]] then inc(ans); writeln(ans); close(input); close(output) End.
-代码见下页-
第 4 页 共 13 页
NOIP2014 普及组 解题报告
By yearwhk
【参考代码】

NOIP 2007 普及组 解题报告

NOIP 2007 普及组 解题报告

NOIP 2007 普及组解题报告By 江苏省赣榆县实验中学初二参赛选手夏雨( 阿洛.c ) 我仅仅想用本文启发一下NOIP2007普及组的同学们,我也不是什么牛,仅仅是意见交流,另:本文供各位路过的牛们鄙视下。

第一题:奖学金【题目描述】:【解题思路】:这一题有很多种做法,包括排序、模拟等等。

现在,介绍一种最优算法,(其实最烂算法也可以全过,数据规模毕竟很小,呵呵)插排(时间复杂度:平均O(N),最坏O(N2),空间复杂度:O(1)。

)思路:1.开一个结构类型(Pascal里是record,C/C++是struct.),包含了学号信息,总分成绩,语文成绩。

或者也可以开三个以下标为关联的一维数组,一次表示上述三个参数。

2.读入。

每当读入一行信息,调用过程insert,从前向后依次寻找,直到寻找到某一记录的总分比当前读入总分小,或其总分和当前读入总分相等且语文成绩比当前总分小,则在当前位置插入所读入的数据。

(这个插入可以是将后面的数据依次向后移动一位,也可以是通过链表的方法实现。

)3.输出,从1至5,输出学号和总分即可。

还有一点要注意的是,当总分相等,且语文成绩也相等的时候,就要将学号小的排在前面。

【解题感想】:对于这种送分题,千万不要辜负出卷人的期望,能拿到的分数就一定要拿到。

否则既对不起老师,也对不起出卷人,更对不起自己。

读题目的时候千万要仔细,我同学就是因为这一题的语文处理有点问题而白白掉了3个点。

第二题奖品分组【题目描述】:【解题思路】:这一题乍一看起来,像是动态规划,很多选手被问题的“最”字迷惑了,拿到题目就开始乐呵呵的DP.殊不知,此题如用动归来做,确实是可以实现的,但编程复杂度很高。

下面介绍一种简单易行的方法:简单哈希表+贪心=哈贪(时间复杂度:平均O(N),最坏O(N2),空间复杂度O(1).)思路:1.开一个a[1..200]的数组作为桶,至于类型Integer足够用了,因为即使最坏情况——所有的数据都在一个桶里,也不过是30000个。

NOIp2017普及组解题报告与参赛总结

NOIp2017普及组解题报告与参赛总结

5
10 2
时间复杂度 ������(1) 空间复杂度 ������(1)
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 3 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
代码_算法一(Pascal)
1 var
29
ans := a[j];
30
if ans = '666666666' then writeln(-1) else writeln(ans);
31 end;
32 close(input);
33 close(output);
34 end.
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 7 / 28
算法一(100pts)
因为题目较为简单,所以直接将正解吧。 先读入元素集合和 ������ 个询问,对于每个询问 ������������, ������������,因为已经给定位数,且位 数不多,直接枚举(暴力)求出 ������������������1≤������≤������ ������������ (������������ ������������������ 10������������ = ������������) 即可。 时间复杂度 ������(������������) 空间复杂度 ������(1)
20
ans := a[j];
21
if ans = maxlongint then writeln(-1) else writeln(ans);
22 end;

NOIP2007试题+答案+解析(学生版)

NOIP2007试题+答案+解析(学生版)

第十三届全国青少年信息学奥林匹克联赛初赛试题(普及组Pascal 语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。

每题有且仅有一个正确答案。

)1.在以下各项中,()不是CPU的组成部分。

A.控制器B.运算器C.寄存器D.主板2.在关系数据库中,存放在数据库中的数据的逻辑结构以()为主。

A.二叉树B.多叉树C.哈希表D.二维表3.在下列各项中,只有()不是计算机存储容量的常用单位。

A.Byte B.KB C.UB D.TB4.ASCII码的含义是()。

A.二→十进制转换码 B.美国信息交换标准代码C.数字的二进制编码D.计算机可处理字符的唯一编码5.一个完整的计算机系统应包括()。

A.系统硬件和系统软件B.硬件系统和软件系统C.主机和外部设备D.主机、键盘、显示器和辅助存储器6.IT的含义是()。

A.通信技术B.信息技术C.网络技术D.信息学7.LAN的含义是()。

A.因特网B.局域网C.广域网D.城域网8.冗余数据是指可以由其它数据导出的数据。

例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。

冗余数据往往会造成数据的不一致。

例如,上面4个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。

下面关于冗余数据的说法中,正确的是()。

A.应该在数据库中消除一切冗余数据B.用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据C.为了提高查询效率,在数据库中可以保留一些冗余数据,但更新时要做相容性检验D.做相容性检验会降低效率,可以不理睬数据库中的冗余数据9.在下列各软件,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。

A.gcc B.g++ C.Turbo C D.Free Pascal10.以下断电后仍能保存数据的有()。

NOIP2017普及组解题报告非官方

NOIP2017普及组解题报告非官方

NOIP2017普及组解题报告-by 郑佳睿1. 成绩(score.cpp/c/pas)【问题描述】牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是:总成绩= 作业成绩×20% + 小测成绩×30% + 期末考试成绩×50%牛牛想知道,这门课程自己最终能得到多少分。

【输入格式】输入文件只有1 行,包含三个非负整数A、B、C,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。

相邻两个数之间用一个空格隔开,三项成绩满分都是100 分。

【输入样例1】100 100 80【输出样例1】90【输入样例2】60 90 80【输出样例2】79【数据说明】30% 的数据,A = B = 0。

对于另外30% 的数据,A = B = 100。

对于100% 的数据,0 ≤A、B、C ≤100 且A、B、C 都是10 的整数倍。

【题解】超级水题,输入数据都是10的倍数,不用考虑浮点的问题,直接输出答案。

【代码】#include<bits/stdc++.h>using namespace std;int a,b,c;int main(){cin>>a>>b>>c;cout<<(a*2+b*3+c*5)/10<<endl;return 0;}2. 图书管理员(librarian.cpp/c/pas)【问题描述】图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。

每位借书的读者手中有一个需求码,这个需求码也是一个正整数。

如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。

小D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出-1【输入格式】输入文件的第一行,包含两个正整数n 和q,以一个空格分开,分别代表图书馆里书的数量和读者的数量。

NOIP2023提高组解题报告

NOIP2023提高组解题报告

NOIP2023提高组解题报告1. 前言NOIP(全国信息学奥林匹克竞赛)是中国非常重要的信息学竞赛之一,旨在选拔和培养高中阶段的优秀信息学人才。

在NOIP中,提高组是一个相对较高难度的组别,要求选手具备扎实的编程基础和复杂问题的解决能力。

在本文档中,将对NOIP2023提高组的解题情况进行详细的报告和分析。

2. 题目概览本次NOIP2023提高组共计有以下几道题目:1.田忌赛马(Tianji Race)2.矩阵乘法(Matrix Multiplication)3.数字问题(Number Problem)4.字符串排序(String Sort)下面将对每道题目的解题思路和实现进行详细说明。

3. 田忌赛马田忌赛马是第一道题目,题目要求给出两组马匹的速度,分别是田忌的马匹和齐王的马匹,然后判断田忌最多能赢齐王多少场比赛。

解题思路非常简单,只需要对田忌和齐王的马匹进行排序,从最快的马开始进行配对比赛。

如果田忌的马比齐王的马快,那么田忌赢得这场比赛,分数加一;否则,田忌选择最慢的马匹进行比赛。

通过这样的遍历方式,最后的得分就是田忌能够赢得比赛的场数。

具体实现代码如下:def solve(Tianji, QiWang):Tianji.sort()QiWang.sort()t_index =0q_index =0score =0while t_index < len(Tianji) and q_index < len(QiWang):if Tianji[t_index] > QiWang[q_index]:score +=1t_index +=1q_index +=1else:t_index +=1return score4. 矩阵乘法矩阵乘法是第二道题目,题目需要实现一个矩阵乘法的算法。

解题思路比较直接,使用两层循环对两个矩阵进行迭代计算,然后累加乘积,得到最终结果。

具体实现代码如下:def multiply_matrix(A, B):row_A = len(A)col_A = len(A[0])col_B = len(B[0])C = [[0] * col_B for _ in range(row_A)]for i in range(row_A):for j in range(col_B):for k in range(col_A):C[i][j] += A[i][k] * B[k][j]return C5. 数字问题数字问题是第三道题目,题目要求给出一个正整数n,判断是否存在一个正整数x,使得n的位数的立方和等于x。

2007年NOIP提高组第二题解题报告字符串的展开

2007年NOIP提高组第二题解题报告字符串的展开

2.字符串的展开(expand.pas/c/cpp)【问题描述】在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678” 。

在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。

具体约定如下:(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-” ,减号两侧同为小写字母或同为数字,且按照ASCII 码的顺序,减号右边的字符严格大于左边的字符。

(2)参数p1:展开方式。

p1=1 时,对于字母子串,填充小写字母;p1=2 时,对于字母子串,填充大写字母。

这两种情况下数字子串的填充方式相同。

p1=3 时,不论是字母子串还是数字子串,都用与要填充的字母个数相同的星号“*”来填充。

(3)参数p2:填充字符的重复个数。

p2=k 表示同一个字符要连续填充k 个。

例如,当p2=3 时,子串“d-h”应扩展为“deeefffgggh” 。

减号两侧的字符不变。

(4)参数p3:是否改为逆序:p3=1 表示维持原有顺序,p3=2 表示采用逆序输出,注意这时仍然不包括减号两端的字符。

例如当p1=1、p2=2、p3=2 时,子串“d-h”应扩展为“dggffeeh” 。

(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de” ,“3-4”应输出为“34” 。

如果减号右边的字符按照ASCII 码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d” ,“3-1”应输出为“3-1”。

【输入】输入文件expand.in 包括两行:第 1 行为用空格隔开的 3 个正整数,依次表示参数p1,p2,p3。

第 2 行为一行字符串,仅由数字、小写字母和减号“-”组成。

NOIP普及组解题分析报告

NOIP普及组解题分析报告

NOIP普及组解题报告————————————————————————————————作者:————————————————————————————————日期:NOIP2014普及组复赛解题报告本人是潍坊一中的wyw,69级,今年高一,现在马上就要NOIP了,打算把历年的NOIP普及、提高组题目都做一下,然后写写解题报告∵这个报告主要是给初中同学看的,所以我会写的详细一点Prolem 1 珠心算测试(count)这道题其实很简单,意思就是说给你一些数a1,a2,a3,a4...a n,然后让你回答有多少个A+B=C(A ≠ B ≠ C)满足(回答C的数量,而不是等式的数量)方法一那么有一种很明显的做法就是三层循环枚举C、A、B,注意:C是在最外层,若找到了一个A和一个B,满足上述等式,则C是一个符合要求的解,这时ans++,并且退出当前枚举,枚举下一个C,这种算法的时间复杂度是O(N3)而我当时没想到这个算法,因为有更好用而且简单更不容易出错的解法,方法二两重循环,分别枚举i=1...n,j=i+1...n,如果ai+aj这个数在集合中存在,那么you[a i+a j]←true,然后再从a1到a n做一次扫描,只要you[a i],ans++这个算法的好处在于它很好写,不用退出什么的,也不用注意循环的顺序,而且时间复杂度是O(N2)代码(方法2):#include<cstdio>using namespace std;int n, a[101], i, j, count;bool you[20001]={false};int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++)for(j=i+1;j<=n;j++)you[ a[i]+a[j] ]=true;count=0;for(i=1;i<=n;i++)count += you[ a[i] ];printf("%d\n",count);return 0;}在此征求一下大神的意见,如有更快的做法,敬请奉上小结:这道题很简单,但很多人没有做对的原因就是没有好好理解题意,但是根本原因其实还在于心态太骄傲了,认为是第一题就可以轻视,这样是不好的,水题我们更要做好啊,你想想同样是100分,这100分多么好拿,所以是水题、越该放平心态,细心地做。

NOIP2021普及组复赛试题与解题报告

NOIP2021普及组复赛试题与解题报告

NOIP2021普及组复赛试题与解题报告noip2021普及组解题报告一、国际标准书号(ISBN.PAS/C/CPP)【问题描述】每本正式出版的书都有一个对应的ISBN号。

ISBN代码包括9位数字、1位识别码和3位分隔符。

其指定的格式类似于“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码。

例如,0-670-82162-4是标准ISBN代码。

ISBN编码的第一位表示该书的出版语言,例如,0表示英语;第一个分隔符“-”后的三位数字代表出版社,例如670代表维京出版社;第二个分隔后的五位数字代表出版社的书号;最后一位是识别码。

识别码的计算方法如下:将第一个数字乘以1,最后一个数字乘以2。

等等结果是mod11,剩下的是识别码。

如果余数为10,则标识码为大写字母X。

例如,ISBN编号0-670-82162-4中的标识码4是通过将九个编号067082162从左到右乘以1,2,。

,9,然后求和,即0×1+6×2+…+2×9=158,然后取158mod11的结果4作为识别码。

你的任务是编写程序判断输入的isbn号码中识别码是否正确,如果正确,则仅输出“right”;如果错误,则输出你认为是正确的isbn号码。

【输入】输入文件ISBN In只有一行,是一个字符序列,代表一本书的ISBN号(确保输入符合ISBN号的格式要求)。

[输出]输出文件isbn.out共一行,假如输入的isbn号码的识别码正确,那么输出“right”,否则,按照规定的格式,输出正确的isbn号码(包括分隔符“-”)。

[输入/输出示例1]ISBN in0-670-82162-4isbn.outright[input/output example 2]中的ISBN0-670-82162-0isbn。

out0-670-82162-4【试题分析】对于基本的字符串处理问题,那些更加小心的人可以得到满分。

noip2016普及组解题报告

noip2016普及组解题报告

买铅笔【题目描述】P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。

她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。

为了公平起见,P老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n 支铅笔最少需要花费多少钱。

【输入格式】输入的第一行包含一个正整数n,表示需要的铅笔数量。

接下来三行,每行用两个正整数描述一种包装的铅笔:其中第一个整数表示这种包装内铅笔的数量,第二个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。

【输出格式】输出一行一个整数,表示P老师最少需要花费的钱。

【样例输入】572 250 3030 27【样例输出】54【算法分析】水题,整除、取余。

【AC代码】varn,i,a,b,p,ans:longint; beginreadln(n);ans:=maxlongint;for i:=1 to 3 dobeginread(a,b);if (n mod a)<>0 then p:=(n div a +1)*belsep:=(n div a)*b;if p<ans then ans:=p; end;writeln(ans);end.回文日期【题目描述】在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期。

显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。

现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

一个8位数字是回文的,当且仅当对于所有的i ( 1 <=i<= 8 )从左向右数的第i 个数字和第9-i个数字(即从右向左数的第i个数字)是相同的。

Noip2012普及组解题报告

Noip2012普及组解题报告

while j<>x do begin t:=(t+1) mod m; if a[i,t,1]=1 then j:=j+1; end; s:=s+x; end; writeln(s mod 20123); close(input); close(output); end.
算法 2
var n,m,i,j,k,ans,x,y,z:longint; a:array[1..10005,1..105,1..2]of longint; s:array[1..10005]of longint; begin assign(input,'treasure.in'); assign(output,'treasure.out'); reset(input); rewrite(output); readln(n,m); fillchar(s,sizeof(s),0); for i:=1 to n do for j:=1 to m do begin readln(a[i,j,1],a[i,j,2]); s[i]:=s[i]+a[i,j,1]; end; readln(x); x:=(x mod m)+1; ans:=0; for i:=1 to n do begin ans:=(ans+a[i,x,2]) mod 20123; if i=n then break; z:=x; a[i,x,2]:=a[i,x,2] mod s[i]; if a[i,x,2]=0 then a[i,x,2]:=s[i]; y:=a[i,x,1]; while y<a[i,z,2] do begin x:=(x mod m)+1; y:=y+a[i,x,1];

2007NOIP普及组奖学金解题报告

2007NOIP普及组奖学金解题报告

1.奖学金(scholar.pas/c/cpp)【问题描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。

期末,每个学生都有3门课的成绩:语文、数学、英语。

先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。

注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。

例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:7 2795 279这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。

这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。

如果你的前两名的输出数据是:5 2797 279则按输出错误处理,不能得分。

【输入】输入文件scholar.in包含n+1行:第1行为一个正整数n,表示该校参加评选的学生人数。

第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。

第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。

每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。

所给的数据都是正确的,不必检验。

【输出】输出文件scholar.out共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。

【输入输出样例1】scholar.in 690 67 8087 66 9178 89 9188 99 7767 89 6478 89 98【输入输出样例2】scholar.in 880 89 8988 98 7890 67 8087 66 9178 89 9188 99 7767 89 6478 89 98scholar.out8 2652 2646 2641 2585 258scholar.out6 2654 2643 2582 2441 237【限制】50%的数据满足:各学生的总成绩各不相同100%的数据满足:6<=n<=300解题:从题意可知是一个二维数组的排序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

普及组exp的解题报告
南京树人国际学校徐韧喆
【题目描述】
对于1 位二进制变量定义两种运算:
运算符运算规则
⊕0⊕0=0
0⊕1=1
1⊕0=1
1⊕1=1
×0×0=0
0×1=0
1×0=0
1×1=1
运算的优先级是:
1. 先计算括号内的,再计算括号外的。

2. “×”运算优先于“⊕”运算,即计算表达式时,先计算×运算,再计算⊕运算。

例如:计算表达式A⊕B ×C时,先计算B ×C,其结果再与A 做⊕运算。

现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字0 或者1 ,请问
有多少种填法可以使得表达式的值为0 。

【输入】
输入文件名为exp.in ,共2 行。

第1 行为一个整数L,表示给定的表达式中除去横线外的运算符和括号的个数。

第2 行为一个字符串包含L 个字符,其中只包含’(’、’)’、’+’、’*’这4 种字符,其中’(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。

这行字符按顺序
给出了给定表达式中除去变量外的运算符和括号。

【输出】
输出文件exp.out 共1 行。

包含一个整数,即所有的方案数。

注意:这个数可能会很大,请输出方案数对10007 取模后的结果。

【样例】
exp.in
4
+(*)
exp.out
3
【数据范围】
对于20% 的数据有0 ≤L ≤10。

对于50% 的数据有0 ≤L ≤1,000。

对于70% 的数据有0 ≤L ≤10,000 。

对于100%的数据有0 ≤L ≤100,000。

对于50% 的数据输入表达式中不含括号。

【问题分析】
这是一道表达式计算的扩展题,对选手最基本的要求就是表达式计算。

在一般的表达式计算中,存放结果的栈都是记录计算到某一步的结果,而在这道题中,结果只可能为2个(0或者1),且是知道的,而运算的数字是不一定的,所以在栈中只需存放算到0或者1时的方案数,最后输出到最后算出0的方案数即可。

【算法实现】
一、
首先粗略地说一下表达式计算的方法:
需要使用两个栈,一个存放结果,另一个存放符号。

每次读入一个数据,就进入结果栈,如果是符号,则按以下方法:
1、如果是左括号,就直接进栈;
2、如果是右括号,就一直弹栈并加以计算,直到弹到左括号;
3、如果是运算符,则弹栈,直到这个运算符的优先级大于符号栈栈顶的符号的优先级
或是左括号或栈空,然后将运算符进栈;
最后再将栈中残余的符号和结果一直弹到只剩一个结果,这个就是最后的结果。

二、
此题算法的框架整体上是和表达式计算相同的,有以下几个方面不同:
1、需要添加数字的地方应该满足不在右括号的后面或者左括号的前面
2、优先级:“*”的优先级比“+”高
3、运算方法,每一步计算为0或1的方法数:设两个步骤的运算结果经过每个符号到一个结果时,第一个运算结果算出0的方案数为t1,1的方案数为t2,第二个算出0的方案数为t3,算出1的方案数为t4,则有:
当符号是“⊕”时,得到0的方案数为t1*t3,1的方案数:t1*t4+t2*t3+t2*t4
当符号是“×”时,得到0的方案数为t1*t3+t1*t4+t2*t3,1的方案数:t2*t4
用一个栈记录下来即可。

【程序实现】
var str:ansistring;
nn,n,i,top1,top2,kk:longint;
ans1,ans2:array[1..200000] of longint;
fu:array[1..200000] of char;
procedure suan(top1,top2:longint); {计算每一步的方案数}
var t1,t2,t3,t4:longint;
begin
t1:=ans1[top1];t2:=ans2[top1];
t3:=ans1[top1+1];t4:=ans2[top1+1];
if fu[top2]='+' then
begin
ans1[top1]:=t1*t3 mod 10007;
ans2[top1]:=(t1*t4+t2*t4+t2*t3) mod 10007;
end
else
begin
ans1[top1]:=(t1*t3+t1*t4+t2*t3) mod 10007;
ans2[top1]:=t2*t4 mod 10007;
end;
end;
function jisuan(ch:char):longint; {计算优先级}
begin
case ch of
'#','(':jisuan:=0;
'+':jisuan:=1;
'*':jisuan:=2;
end;
end;
begin
assign(input,'exp.in');
assign(output,'exp.out');
reset(input);
rewrite(output);
readln(n);
readln(str);
top1:=0;
fu[1]:='#';
top2:=1;
if str[n]<>')' then nn:=n+1 else nn:=n;
for i:=1 to nn do {表达式运算的过程}
begin
if (i=n+1) or (((i=1) or (str[i-1]<>')')) and (str[i]<>'(')) then begin
inc(top1);
ans1[top1]:=1;
ans2[top1]:=1;
end;
if i<>n+1 then
if str[i]='(' then
begin
inc(top2);
fu[top2]:='(';
end
else
if str[i]=')' then
begin
while fu[top2]<>'(' do
begin
suan(top1-1,top2);
dec(top1);
dec(top2);
end;
dec(top2);
end
else
begin
kk:=jisuan(str[i]);
while jisuan(fu[top2])>=kk do
begin
suan(top1-1,top2);
dec(top1);
dec(top2);
end;
inc(top2);
fu[top2]:=str[i];
end;
end;
while top2>1 do
begin
suan(top1-1,top2);
dec(top1);
dec(top2);
end;
writeln(ans1[1]);
close(input);
close(output);
end.
【总结】
表达式计算是非常基本的东西,我们必须熟练掌握它,才能做好这样一道题目。

由此可见,一些基础的算法还是需要多多练习、反思的。

相关文档
最新文档