版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年6月青少年软件编程C/C++等级考试八级真题(含答案)一、编程题(共4题,共100分)。1.产品研发。题目描述:一家公司正在研发一款新产品。该产品共有K项关键性能指标,初始时所有指标均为0。公司的最终目标是让每一项指标都不低于P。研发团队提出了N个独立的改进方案。第i个方案一旦实施,会同时为第j项指标(1≤j≤K)带来Ai,j的提升,但实施该方案需要投入Ci的研发成本。每个方案最多只能执行一次。你需要判断:是否存在一系列方案的选择,使得所有指标均达到或超过P?如果存在,请给出最小的总研发成本;如果不存在,输出−1。输入格式:第一行,三个整数N,K,P,分别表示方案数量、指标数量和目标阈值。接下来N行,每行K+1个整数Ci,Ai,1,Ai,2,…,Ai,K,分别表示第i个方案的成本,以及执行后各指标的提升值。输出格式:输出一个整数,表示达成目标所需的最小总成本。若无法达成,输出−1。输入样例1:4355302312332401014输出样例1:9输入样例2:73585101371103820045022671101222094221输出样例2:-1说明提示:1≤N≤100。1≤K,P≤5。0≤Ai,j≤P(1≤i≤N,1≤j≤K)。1≤Ci≤109(1≤i≤N)。参考程序:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllINF=1e18;structNode{llc;vector<int>a;};intmain(){intN,K,P;cin>>N>>K>>P;vector<Node>opt(N);for(inti=0;i<N;i++){llci;cin>>ci;opt[i].c=ci;opt[i].a.resize(K);for(intj=0;j<K;j++){cin>>opt[i].a[j];}}//dp多维,用数组模拟K维,最多K=5。vector<int>dim(K,P+1);vector<ll>dp;inttotal=1;for(autod:dim)total*=d;dp.assign(total,INF);//初始状态全部0。dp[0]=0;autoget_idx=[&](vector<int>s)->int{intid=0;for(inti=0;i<K;i++){id=id*(P+1)+s[i];}returnid;};for(auto&cur:opt){//01背包,要倒序遍历所有状态,复制一份。vector<ll>ndp=dp;for(intmask=0;mask<total;mask++){if(dp[mask]==INF)continue;//解码mask得到当前各指标。vector<int>st(K);inttmp=mask;for(inti=K-1;i>=0;i--){st[i]=tmp%(P+1);tmp/=(P+1);}//使用这个方案,更新状态,每个值不超过P。vector<int>nst(K);for(intj=0;j<K;j++){nst[j]=min(P,st[j]+cur.a[j]);}intnid=get_idx(nst);if(ndp[nid]>dp[mask]+cur.c){ndp[nid]=dp[mask]+cur.c;}}dp.swap(ndp);}//目标状态:全部等于P。vector<int>target(K,P);inttar_id=get_idx(target);llans=dp[tar_id];if(ans>=INF)cout<<-1<<endl;elsecout<<ans<<endl;return0;}2.传话对象。题目描述:在一个公司里,有n名员工,编号1到n。每名员工都有一个“传话对象”,即第i名员工只会把消息告诉第ti名员工(允许告诉自己)。现在,从每名员工出发,依次沿着传话对象传递消息,可以证明经过有限步后,消息一定会回到一个已经传过的员工。请你分别计算:从第i名员工开始,需要传递多少步后,才会第一次遇到一个已经传过消息的员工。输入格式:第一行,一个整数n。第二行,n个整数t1,t2,…,tn,表示第i名员工的传话对象。输出格式:输出n行,第i行一个整数,表示从第i名员工出发的答案。输入样例:42114输出样例:2231说明提示:1≤n≤5×105。参考程序:#include<bits/stdc++.h>usingnamespacestd;constintMAXN=500005;intt[MAXN];intans[MAXN];intvis[MAXN];//0未访问,1正在访问栈中,2处理完毕。intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;cin>>n;for(inti=1;i<=n;i++){cin>>t[i];}for(inti=1;i<=n;i++){if(vis[i])continue;vector<int>path;intcur=i;while(true){if(vis[cur]==1){//找到环:cur是环上第一个重复点,在path中找下标pos。autoit=find(path.begin(),path.end(),cur);intpos=it-path.begin();//环部分:环长len。intlen=path.size()-pos;for(intj=pos;j<path.size();j++){ans[path[j]]=len;vis[path[j]]=2;}//环前面链上的点。for(intj=pos-1;j>=0;j--){ans[path[j]]=ans[t[path[j]]]+1;vis[path[j]]=2;}break;}if(vis[cur]==2){//整条path都指向已经算好的点。for(intj=(int)path.size()-1;j>=0;j--){ans[path[j]]=ans[t[path[j]]]+1;vis[path[j]]=2;}break;}vis[cur]=1;path.push_back(cur);cur=t[cur];}}for(inti=1;i<=n;i++){cout<<ans[i]<<'\n';}return0;}3.能量护盾。题目描述:在一处被宇宙射线笼罩的星域中,你驾驶着一艘小型探索飞船,需要从坐标(xs,ys)航行到坐标(xt,yt)。飞船可以以速度1向任意方向移动,自身视为一个点。星域中分布着N个圆形能量护盾,第i个护盾的圆心为(xi,yi),半径为ri。护盾之间可能相互重叠,也可能存在包含关系。飞船一旦进入某个护盾的内部,就能免受宇宙射线的伤害。若一个点不在任何护盾内部,则飞船会持续受到宇宙射线的照射。你的目标是:在从起点到终点的航行过程中,尽可能减少受到宇宙射线照射的总时间。请你计算这个最小照射时间。输入格式:第一行,四个整数xs,ys,xt,yt,分别表示起点和终点的坐标。第二行,一个整数N,表示圆形护盾的数量。接下来N行,每行三个整数xi,yi,ri,描述第i个护盾的圆心坐标和半径。输出格式:输出一个实数,表示受到宇宙射线照射的最小时间,保留10位小数。输入样例1:-2-2221001输出样例1:3.6568542495输入样例2:-20202-102102输出样例2:0.0000000000输入样例3:4-2-243002401041输出样例3:4.0000000000说明提示:−109≤xs,ys,xt,yt≤109。(xs,ys)≠(xt,yt)。1≤N≤1000。−109≤xi,yi≤109。1≤ri≤109。参考程序:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefdoubledb;constdbINF=1e18;constdbeps=1e-12;structCircle{llx,y,r;};dbdist2p(llx1,lly1,llx2,lly2){lldx=x1-x2;lldy=y1-y2;returnsqrt((db)dx*dx+(db)dy*dy);}intmain(){ios::sync_with_stdio(false);llxs,ys,xt,yt;cin>>xs>>ys>>xt>>yt;intN;cin>>N;vector<Circle>cir(N);for(inti=0;i<N;i++){cin>>cir[i].x>>cir[i].y>>cir[i].r;}//0:起点S,1~N:N个护盾,N+1:终点T。inttot=N+2;intS=0;intT=N+1;vector<vector<pair<int,db>>>g(tot);//S直接连T。dbST=dist2p(xs,ys,xt,yt);g[S].emplace_back(T,ST);//S连各个圆i(1‑N)。for(inti=0;i<N;i++){dbd=dist2p(xs,ys,cir[i].x,cir[i].y);dbw;if(d<=cir[i].r+eps){w=0.0;}else{w=d-cir[i].r;}g[S].emplace_back(i+1,w);}//T连各个圆i。for(inti=0;i<N;i++){dbd=dist2p(xt,yt,cir[i].x,cir[i].y);dbw;if(d<=cir[i].r+eps){w=0.0;}else{w=d-cir[i].r;}g[i+1].emplace_back(T,w);}//圆i和圆j之间建边。for(inti=0;i<N;i++){for(intj=i+1;j<N;j++){dbd=dist2p(cir[i].x,cir[i].y,cir[j].x,cir[j].y);dbw;if(d<=cir[i].r+cir[j].r+eps){w=0.0;}else{w=d-cir[i].r-cir[j].r;}g[i+1].emplace_back(j+1,w);g[j+1].emplace_back(i+1,w);}}vector<db>dis(tot,INF);priority_queue<pair<db,int>,vector<pair<db,int>>,greater<pair<db,int>>>q;dis[S]=0;q.emplace(0.0,S);while(!q.empty()){pair<db,int>cur=q.top();q.pop();dbd=cur.first;intu=cur.second;if(d>dis[u]+eps)continue;for(auto&edge:g[u]){intv=edge.first;dbw=edge.second;if(dis[v]>d+w+eps){dis[v]=d+w;q.emplace(dis[v],v);}}}printf("%.10lf\n",dis[T]);return0;}4.图书馆。题目描述:某城市有n条东西向街道和n条南北向街道,构成一个n×n的街区网格。每个交叉路口处恰好建有一座图书馆,且每一行、每一列的交叉路口都恰好有一座图书馆。已知第i座图书馆的坐标(xi,yi)表示它位于第xi条东西向街道与第yi条南北向街道的交汇处。城市规划师想要知道:有多少个正方形区域(由连续的若干条东西向街道和连续的若干条南北向街道围成),使得该区域内每一行、每一列也恰好各有一座图书馆?输入格式:第一行,一个整数n。第二行,n个整数x1,x2,…,xn,表示第i座图书馆的东西向街道编号。第三行,n个整数y1,y2,…,yn,表示第i座图书馆的南北向街道编号。输入保证:1≤xi,yi≤n,且每行每列恰好只有一座图书馆。输出格式:输出一个整数,表示满足条件的正方形区域个数。输入样例:712345674316257输出样例:10说明提示:1≤n≤105。1≤xi,yi≤n。输入保证每行每列恰好有一座图书馆。参考程序:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=100010;intpos[MAXN];intst_max[MAXN][20];intst_min[MAXN][20];intlogn[MAXN];intn;voidbuild_st(){logn[1]=0;for(inti=2;i<=n;i++)logn[i]=logn[i/2]+1;for(inti=1;i<=n;i++){st_max[i][0]=pos[i];st_min[i][0]=pos[i];}for(intj=1;j<=19;j++){for(inti=1;i+(1<<j)-1<=n;i++){st_max[i][j]=max(st_max[i][j-1],st_max[i+(1<<(j-1))][j-1]);st_min[i][j]=min(st_min[i][j-1],st_min[i+(1<<(j-1))][j-1]);}}}inlineintget_max(intl,intr){intk=logn[r-l+1];returnmax(st_max[l][k],st_max[r-(1<<k)+1][k]);}inlineintget_min(intl,intr){intk=logn[r-l+1];returnmin(st_min[l][k],st_min[r-(1<<k)+1][k]);}llsolve(intL,intR){if(L>R)return0;if(L==R)return1;intmid=(L+R)/2;llres=solve(L,mid)+solve(mid+1,R);vector<pair<int,int>>left,right;intmaxL=-1,minL=n+1;for(intp=mid;p>=L;p--){maxL=max(maxL,pos[p]);minL=min(minL,pos[p]);left.emplace_back(maxL,minL);}intmaxR=-1,minR=n+1;for(intq=mid+1;q<=R;q++){maxR=max(maxR,pos[q]);minR=min(minR,pos[q]);right.emplace_back(maxR,minR);}if(left.size()<right.size()){for(intk=0;k<left.size();k++){auto&Lpair=left[k];intmx1=Lpair.first;intmn1=Lpair.second;for(intt=0;t<right.size();t++){auto&Rpair=right[t];intmx2=Rpair.first;intmn2=Rpair.second;intmx=max(mx1,mx2);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026赛鹏智能物流行业市场现状供需分析及投资评估前景分析研究报告
- 咳嗽中医内科考试题目及答案
- 2025~2026学年江苏南通市启秀中学度第二学期单元练习九年级物化试卷-初中化学
- 2026年辽宁沈阳市铁西区中考一模地理试卷
- 2026年初中历史重点题试卷及解析冲刺押题
- 2026年沧州新高考数学全程复习规划与备考指南(一轮+二轮+三轮)含易考题、常考题、易错题
- 2026医药包装材料一致性评价要求与供应商准入标准报告
- 2026中国智能汽车座舱系统市场需求现状及发展方向报告
- 2026中国新能源汽车热泵技术行业市场供需分析及投资评估规划分析研究报告
- 2026中国智能农业设备行业市场深度调研及发展趋势和投资前景预测研究报告
- 2026广西数字金服科技有限公司招聘6人笔试模拟试题及答案详解
- 2026 工程管理自来水公司招聘考试参考题库 含答案
- 甲状腺肿瘤介入栓塞术知情同意书
- 公立医院行政管理岗招聘考试核心考点笔记:医疗质量安全核心制度
- 2026年备考安全员之B证(项目负责人)通关题库(附带答案)
- 拒绝内耗拥抱自己主题班会课件
- T-XJNYZLXH 004-2025 芜菁(恰玛古)标准规范
- 广东省广播电视网络股份有限公司招聘笔试题库2026
- 英语辅导老师培训课件
- 心脏标志物在围术期非心脏手术应用专家共识解读(2025版)课件
- 薪酬管理第6版
评论
0/150
提交评论