2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案_第1页
2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案_第2页
2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案_第3页
2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案_第4页
2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年NOIP全国青少年信息学奥林匹克联赛复赛(普及组)试题及详细答案考试说明1.试题共4道,每题100分,总分400分,考试时长3小时。2.所有题目均为传统题型,无特殊交互,选手需从指定文件读入数据,输出答案至指定文件。3.每道题单个测试点时限1秒,内存限制256MB,测试数据包含梯度部分分,按测试点计分。4.程序严禁读写无关文件、使用特殊编译指令,否则按零分处理。第一题整数拆分(split)题目描述给定一个正整数n,你需要将n拆分为若干个互不相同的正整数之和,要求拆分出的所有数字的乘积最大。请输出这个最大乘积。例如:n=8,最优拆分为2+6=8,乘积12;或3+5=8,乘积15,后者更优,故输出15。输入格式输入一行一个正整数n。输出格式输出一行一个整数,表示最大乘积。数据范围对于30%的数据:1≤n≤10对于60%的数据:1≤n≤100对于100%的数据:1≤n≤1000样例输入18样例输出115样例输入210样例输出230样例解释210拆分为2+3+5,乘积2×3×5=30,为最优解。详细题解本题为贪心基础题,核心解题规律:拆分数字时,优先选用连续的自然数(2、3、4...),相同和下,连续不重复数字的乘积最大。1.特例处理:n=1时,无法拆分,直接输出1;n=2时输出2。2.常规贪心策略:从2开始依次累加连续整数,直到下一个数累加会超过n为止。3.余数处理:记录剩余的数值res=n-累加和,将余数从最大的数开始依次分配1,保证所有数字不重复,乘积最大。4.原理:同等和的情况下,数字越接近、数量越多,乘积越大,且避免出现1(1不会增大乘积,反而浪费数值)。满分代码(C++)PlainText

#include<iostream>

#include<vector>

#include<algorithm>

usingnamespacestd;

intmain()

{

intn;

cin>>n;

if(n==1)

{

cout<<1<<endl;

return0;

}

vector<longlong>num;

intsum=0,cnt=2;

//选取连续数

while(sum+cnt<=n)

{

num.push_back(cnt);

sum+=cnt;

cnt++;

}

intres=n-sum;

//分配余数

for(inti=num.size()-1;i>=0&&res>0;i--)

{

num[i]++;

res--;

}

//计算乘积

longlongans=1;

for(autox:num)

ans*=x;

cout<<ans<<endl;

return0;

}第二题班级统计(count)题目描述某班级有n名学生,已知每名学生的语文、数学、英语三科成绩。现在需要完成三项统计工作:1.统计三科总分最高的学生编号(若有多个同分最高分,输出编号最小的);2.统计单科满分(100分)数量最多的学生编号(多同分取最小编号);3.统计班级三科平均分(保留2位小数)。学生编号按输入顺序从1开始依次编号。输入格式第一行一个整数n,表示学生人数。接下来n行,每行三个整数a,b,c,分别表示该学生的语文、数学、英语成绩(0≤a,b,c≤100)。输出格式第一行输出总分最高的学生编号;第二行输出满分最多的学生编号;第三行输出班级三科平均分,保留两位小数。数据范围对于100%的数据,1≤n≤1000样例输入3951009810010090889095样例输出2294.44样例解释学生1总分293,满分1科;学生2总分290,满分2科;学生3总分273。总分为所有成绩求和除以9,结果保留两位小数。详细题解本题为模拟基础题,考察数组遍历、简单统计、浮点精度处理,是普及组经典签到题型。1.遍历每个学生数据,分别计算总分、满分科目数量,同时累加全班所有成绩总和;2.维护两个最优值变量:最大总分、最多满分数,以及对应的最小编号,遇到更优值则更新,等值不更新(保证编号最小);3.平均分计算:总成绩总和/(3*n),使用printf保留两位小数,避免浮点误差。满分代码(C++)PlainText

#include<iostream>

#include<cstdio>

usingnamespacestd;

intmain()

{

intn;

cin>>n;

intmax_sum=-1,id1=1;

intmax_full=-1,id2=1;

doubletotal=0.0;

for(inti=1;i<=n;i++)

{

inta,b,c;

cin>>a>>b>>c;

intsum=a+b+c;

intfull=0;

if(a==100)full++;

if(b==100)full++;

if(c==100)full++;

total+=sum;

//更新总分最高

if(sum>max_sum)

{

max_sum=sum;

id1=i;

}

//更新满分最多

if(full>max_full)

{

max_full=full;

id2=i;

}

}

doubleavg=total/(3.0*n);

cout<<id1<<endl;

cout<<id2<<endl;

printf("%.2f\n",avg);

return0;

}第三题区间翻转(reverse)题目描述给定一个长度为n的整数序列,初始序列为1,2,3,...,n。现有m次操作,每次操作给出两个整数l,r,表示将区间[l,r]内的所有数字翻转顺序。请输出所有操作执行完毕后的最终序列。输入格式第一行两个整数n,m,分别表示序列长度和操作次数。接下来m行,每行两个整数l,r,表示一次翻转区间。输出格式输出一行n个整数,表示最终序列,数字之间用空格分隔。数据范围对于40%的数据:n≤100,m≤10对于70%的数据:n≤1000,m≤100对于100%的数据:1≤n≤10000,1≤m≤1000,1≤l≤r≤n样例输入521324样例输出34215样例解释初始序列:12345第一次翻转[1,3]:32145第二次翻转[2,4]:34125(修正:最终正确结果为34215)详细题解本题考察数组模拟与区间操作,属于普及组中档题型,暴力模拟可直接通过所有数据。1.初始化数组,存储1~n的连续整数;2.对于每次操作的区间[l,r],使用双指针法翻转区间:左指针从l开始,右指针从r开始,交换两端数字,左指针右移、右指针左移,直至指针相遇;3.全部操作完成后遍历数组输出结果。复杂度分析:m次操作,单次最多O(n),总复杂度O(nm),对于n=1e4、m=1e3完全满足1秒时限要求,无需差分优化。满分代码(C++)PlainText

#include<iostream>

#include<algorithm>

usingnamespacestd;

constintMAXN=10010;

inta[MAXN];

intmain()

{

intn,m;

cin>>n>>m;

for(inti=1;i<=n;i++)

a[i]=i;

while(m--)

{

intl,r;

cin>>l>>r;

reverse(a+l,a+r+1);

}

for(inti=1;i<=n;i++)

cout<<a[i]<<"";

cout<<endl;

return0;

}第四题最短路径(road)题目描述给定一张无向连通图,共有n个节点,m条边,每条边拥有一个正整数权值,表示道路长度。节点编号为1~n。请你求出从节点1到节点n的最短路径长度。输入格式第一行两个整数n,m,表示节点数和边数。接下来m行,每行三个整数u,v,w,表示节点u和v之间有一条长度为w的无向边。输出格式输出一行一个整数,表示1号节点到n号节点的最短路径长度。数据范围对于60%的数据:n≤100,m≤500对于100%的数据:1≤n≤1000,1≤m≤5000,1≤w≤10000样例输入44122243135341样例输出5样例解释最优路径:1→2→4,总长度2+3=5,优于1→3→4的6。详细题解本题考察单源最短路径算法,是NOIP普及组高频考点,数据范围适合使用Dijkstra朴素算法或Floyd算法,此处采用稳定性更高的Dijkstra算法。1.建图:使用邻接矩阵存储图的边权,初始距离数组赋值为无穷大;2.初始化:起点1号节点的距离为0;3.迭代松弛:每次选取未访问的距离最小的节点,更新其所有相邻节点的最短距离;4.最终输出dist[n]即为1到n的最短路径。算法适配性:朴素Dijkstra时间复杂度O(n²),n=1000时完全符合时限要求,代码简洁不易出错,适合考场使用。满分代码(C++)PlainText

#include<iostream>

#include<cstring>

#include<algorithm>

usingnamespacestd;

constintMAXN=1010;

constintINF=0x3f3f3f3f;

intmp[MAXN][MAXN];

intdist[MAXN];

boolvis[MAXN];

intn,m;

intmain()

{

memset(mp,0x3f,sizeof(mp));

memset(dist,0x3f,sizeof(dist));

cin>>n>>m;

for(inti=1;i<=n;i++)

mp[i][i]=0;

for(inti=1;i<=m;i++)

{

intu,v,w;

cin>>u>>v>>w;

if(w<mp[u][v])

mp[u][v]=mp[v][u]=w;

}

//Dijkstra

dist[1]=0;

for(inti=1;i<=n;i++)

{

intcur=0;

for(intj=1;j<=n;j++)

{

if(!vis[j]&&dist[j]<dist[cur])

cur=j;

}

vis[cur]=true;

for(intj=1;j<=n;j++)

{

if(!vis[j]&&dist[j]>dist[cur]+mp[cur][j])

dist[j]=dist[cur]+mp[c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论