NOIP提高组模拟试题(Day1)及详细答案解析_第1页
NOIP提高组模拟试题(Day1)及详细答案解析_第2页
NOIP提高组模拟试题(Day1)及详细答案解析_第3页
NOIP提高组模拟试题(Day1)及详细答案解析_第4页
NOIP提高组模拟试题(Day1)及详细答案解析_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

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

文档简介

NOIP提高组模拟试题(Day1)及详细答案解析考试时长:3小时满分:300分(每题100分)题目说明:三道题目均为标准提高组难度,涵盖基础数论、模拟贪心、树形DP核心考点,贴合历年NOIP真题出题风格,无偏题怪题。T1数字拆分(100分)题目描述给定一个正整数n,要求将n拆分为若干个互不相同的正整数之和,使得拆分出的所有数字的乘积最大。输出这个最大乘积。例如:n=8,最优拆分方案为2+6(乘积12)或3+5(乘积15),最大乘积为15。输入格式一行一个正整数n。输出格式一行一个整数,表示最大乘积。数据范围对于30%的数据:n≤10对于60%的数据:n≤100对于100%的数据:3≤n≤1000样例输入18样例输出115样例输入210样例输出230解题思路本题为经典贪心拆分问题,核心规律:拆分的数字越连续、越接近自然数列,乘积越大,且严格保证数字互不相同。1、优先从2开始累加连续自然数,直到累加和超过n;2、记录剩余差值rest=n-累加和;3、若rest为0,直接累乘所有连续数即可;4、若rest不为0,从最大的数开始依次+1分配余数,保证数字不重复;若余数恰好等于当前数列长度,直接给所有数统一+1。该贪心策略可保证在数字互不相同的前提下,乘积最大化,时间复杂度O(n),完全适配题目数据范围。参考代码(C++)PlainText

#include<iostream>

#include<vector>

usingnamespacestd;

typedeflonglongll;

intmain()

{

intn;

cin>>n;

vector<int>num;

intsum=0,cnt=0;

//构造连续数列

for(inti=2;;i++)

{

if(sum+i>n)break;

sum+=i;

num.push_back(i);

cnt++;

}

intrest=n-sum;

//分配余数

if(rest!=0)

{

if(rest==cnt)

{

for(inti=0;i<cnt;i++)num[i]++;

}

else

{

for(inti=cnt-1;rest>0;i--,rest--)

{

num[i]++;

}

}

}

//计算乘积

llans=1;

for(intx:num)ans*=x;

cout<<ans<<endl;

return0;

}详细解析样例1:n=8,初始累加2+3=5,余数3。数列长度2,余数不等于长度,从后往前分配:3+1=4,2+1=3,最终数列3、5,乘积15。样例2:n=10,初始累加2+3+4=9,余数1。最后一位+1,数列2、3、5,乘积30。边界说明:n=3时,只能拆分为1+2,乘积2;n=4时,拆分为1+3,乘积3。T2区间统计(100分)题目描述给定一个长度为n的整数序列,有m次询问。每次询问给出两个区间[l1,r1]、[l2,r2],求两个区间中相同数字的个数(重复数字只统计一次)。输入格式第一行两个整数n,m,表示序列长度和询问次数。第二行n个整数,为给定的序列。接下来m行,每行四个整数l1,r1,l2,r2,表示一次询问的两个区间。输出格式共m行,每行一个整数,对应每次询问的答案。数据范围对于40%的数据:n,m≤100对于70%的数据:n,m≤1000对于100%的数据:n≤5000,m≤5000,序列数字值域≤1000样例输入521232113241245样例输出21样例解释第一次询问:区间[1,3]数字{1,2,3},区间[2,4]数字{2,3},相同数字为2、3,共2个。第二次询问:区间[1,2]数字{1,2},区间[4,5]数字{2,1},相同数字为1、2,去重后共1类?修正:去重后相同元素为1、2,标准答案输出1为笔误修正:正确输出应为2,原题样例修正为标准结果。解题思路本题核心为区间去重元素交集统计,适配数据范围的最优解法为前缀预处理+暴力统计,无需高级算法。1、预处理二维数组st[i][x],表示前i个位置中,数字x是否出现过;2、对于任意区间[l,r],遍历值域内所有数字,判断该数字是否在两个区间内均出现;3、统计满足条件的数字总数,即为答案。由于值域仅1000,n、m均为5000,总运算量5000*5000*1000会超时,优化方案:对每个区间单独遍历标记存在元素,再遍历小值域统计交集,时间复杂度可完全通过。参考代码(C++)PlainText

#include<iostream>

#include<cstring>

usingnamespacestd;

constintMAXN=5005;

constintMAXV=1005;

inta[MAXN];

boolvis1[MAXV],vis2[MAXV];

intmain()

{

intn,m;

cin>>n>>m;

for(inti=1;i<=n;i++)cin>>a[i];

while(m--)

{

intl1,r1,l2,r2;

cin>>l1>>r1>>l2>>r2;

memset(vis1,0,sizeof(vis1));

memset(vis2,0,sizeof(vis2));

//标记第一个区间的数字

for(inti=l1;i<=r1;i++)vis1[a[i]]=true;

//标记第二个区间的数字

for(inti=l2;i<=r2;i++)vis2[a[i]]=true;

//统计交集

intans=0;

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

{

if(vis1[i]&&vis2[i])ans++;

}

cout<<ans<<endl;

}

return0;

}详细解析算法优势:代码简洁、无复杂预处理,容错率高,完全适配题目数据范围。值域限制是本题关键突破口,相较于遍历区间元素,遍历固定值域可大幅降低时间复杂度。易错点:必须清空每次询问的标记数组,否则会出现上组数据残留导致答案错误;必须去重统计,不能统计重复出现的数字次数。T3树上最大权独立集(100分)题目描述给定一棵n个节点的无根树,每个节点有一个正权值。要求选出一组节点,满足任意两个节点不相邻,使得选出节点的权值总和最大。输出这个最大总和。该问题为经典树上DP模型,无特殊附加约束。输入格式第一行一个整数n,表示节点个数。第二行n个整数,第i个数表示第i个节点的权值。接下来n-1行,每行两个整数u,v,表示u和v之间有一条树边。输出格式一行一个整数,表示最大权值和。数据范围对于50%的数据:n≤20对于80%的数据:n≤1000对于100%的数据:n≤5000样例输入51234512132425样例输出8样例解释最优方案:选择节点3、4、5,权值和3+4+5=8,任意两个节点无相邻,满足题意。解题思路经典树形DP模板题,定义两个状态:1、dp[u][0]:不选u节点时,以u为根的子树的最大权和;2、dp[u][1]:选择u节点时,以u为根的子树的最大权和。状态转移方程:dp[u][1]=val[u]+Σdp[v][0](选u则所有子节点v都不能选)dp[u][0]=Σmax(dp[v][0],dp[v][1])(不选u则子节点可选可不选,取最大值)最终答案为max(dp[root][0],dp[root][1]),根节点可任意选取(默认1号节点)。参考代码(C++)PlainText

#include<iostream>

#include<vector>

#include<algorithm>

usingnamespacestd;

constintMAXN=5005;

vector<int>edge[MAXN];

intval[MAXN];

intdp[MAXN][2];

intn;

//树形DP递归遍历

voiddfs(intu,intfa)

{

dp[u][1]=val[u];//选当前节点

dp[u][0]=0;//不选当前节点

for(intv:edge[u])

{

if(v==fa)continue;

dfs(v,u);

dp[u][1]+=dp[v][0];

dp[u][0]+=max(dp[v][0],dp[v][1]);

}

}

intmain()

{

cin>>n;

for(inti=1;i<=n;i++)cin>>val[i];

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

{

intu,v;

cin>>u>>v;

edge[u].push_back(v);

edge[v].push_back(u);

}

dfs(1,0);

cout<<max(dp[1][0],dp[1][1])<<endl;

return0;

}详细解析本题是NOIP提高组高频考点,核心考察树形DP的状态设计与转移思维。递归遍历整棵树,自底向上更新每个节点的两个状态值,保证每个子树的最优解被继承。复杂度分析:每个节点、每条边仅遍历一次,时间复杂度O(n),可轻松通过n=5000的数

温馨提示

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

评论

0/150

提交评论