考研--c语言编程题二、题除8,1012其它题需要掌握_第1页
考研--c语言编程题二、题除8,1012其它题需要掌握_第2页
考研--c语言编程题二、题除8,1012其它题需要掌握_第3页
考研--c语言编程题二、题除8,1012其它题需要掌握_第4页
考研--c语言编程题二、题除8,1012其它题需要掌握_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

二、编程题(除8,10,12,其它题需要掌握1.问题描近来,跳一跳这款小游戏风靡,受到不少玩家的喜爱1次得分比上一次得分多两分(+8...)输入格12012方块中心,0(此时游戏结束)。输出格112221122样例输变量plus用于加分。初值为0,连续得2分则每次增加2分,如果得分(没有跳到中心)0/*CCF201803-1跳一跳#include<iostream>usingnamespacestd;intmain(){inta,sum=0,plus=0;while(scanf("%d",&a)!=EOF&&a){sum+=a;if(a==plus=0;elseif(a==2){sum+=plus;plus+=2;}}printf("%d\n",sum);return0;}1tn,L,t,用空格分隔,分别表示小球的个数、tna1,a2,an,n输出格t3104679样例说4,6,85,7,96,8,10位置不一定为偶数),7,9,98,8,107,9,91022201866824041210对于所有评测用例,1n100,1t100,2L1000,0ai<L。L2方法一(不排序,使用数组pos[i]第i个球的初始位置;使用数组step[i]第i个球现在的运动方向,step[i]=1表示向右走,step[i]=-1表示往左走,用加法运算改变运动方向。再根据小球的新位置看看有没有2个小球碰头,有的话分别改变运动方向。只是简单地判断2个小球是否碰头需要用法算一下。方法二(结构数组,排序如果不想用,则将有关参数放入一个结构数组中,给每一个小球,排序后再进行模拟,输出结果时再按照重新排序即可。没有好办法就,没有好办法就模拟。这个题正好应验了这两句话/*CCF201803-2碰撞的小球#include<iostream>usingnamespacestd;constintL=1000;intpos[L+1],step[L+1];intmain(){intn,l,cin>>n>>l>>t;for(inti=0;i<n;i++){cin>>//step[i]=if(pos[i]==l||pos[i]==0)step[i]=-step[i];}for(inti=0;i<t;i++)//for(intj=0;j<n;j++){pos[j]+=step[j];//if(pos[j]==l||pos[j]==0)step[j]=-step[j];}//判断是否碰头,碰头则掉头(要避免重复比较for(intj=0;j<n;for(intk=j+1;k<n;k++)if(pos[k]==pos[j])step[k]=-step[k],step[j]=-}for(inti=0;i<n;i++)cout<<pos[i]<<"";cout<<endl;return0;}/*CCF201803-2碰撞的小球#include<iostream>#include<algorithm>usingnamespacestd;constintN=100;structNode{int //小球int //int //运动方向,1表示向右,-1}boolcmp1(Nodea,Node{returna.pos<}boolcmp2(Nodea,Node{returna.id<}int{intn,l,t,id=cin>>n>>l>>t;for(inti=0;i<n;i++){b[i].id=++id;cin>>//b[i].step=if(b[i].pos==l||b[i].pos==0)b[i].step=-b[i].step;}sort(b,b+n,cmp1);for(inti=0;i<t;i++){//for(intj=0;j<n;j++){b[j].pos+=//if(b[j].pos==l||b[j].pos==0)b[j].step=-b[j].step;}//判断是否碰头,碰头则掉头(排序后只需要比较相邻的for(intj=1;j<n;j++)if(b[j].pos==b[j-1].pos)b[j].step=-b[j].step,b[j-1].step=-b[j-}sort(b,b+n,cmp2);for(inti=0;i<n;i++)cout<<b[i].pos<<"";cout<<endl;return}邻的商店n-1,其他为i的商店有两个相邻的商店i-1和i+1。n,8434910对于所有评测用例,2≤n≤1000,第一天每个商店的菜价为不超过10000#include<iostream>usingnamespacestd;inta[1001];int{intn;for(int{}for(int{{cout<<(int)(a[0]+a[1])/2<<"}elseif(i==(n-{{cout<<(int)(a[i-1]+a[i]+a[i+1])/3<<"}}return}买菜问题描都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]...[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]...[cn,dn]在装车。其中,一个时间段[s,t]表示的是从时刻stt-s。n,nci,di,W42510133对于所有的评测用例,1≤n≤2000,ai<bi<ai+1,ci <di<ci+1,对于所有的i(1≤i≤n)有,1≤ai,bi,ci,di≤1000000。#include<stdio.h>inth[20000][3];intmain()intn;//inttime0;//次数intc,d;//scanf("%d",&n);//for(inti=0;i<n;++i)scanf("%d%d&h[i][0],&h[i][1]);}for(intj=0;j<n;j++){scanf("%d%d&c,&d);//c,dfor(inti=0;i<n;i++)//if(c>=h[i][0]&&c<=h[i][1]){if(d>h[i][1]){timeh[i][1]c记录聊天数c=h[i][1];}elsetime+=d-}//}elseif(h[i][0]>c&&h[i][0]<d){if(d<=h[i][1]){time+=d-}elsetime+=h[i][1]-}}}}printf("%d",time);return0;}问题描述(最小差数n5154815936103,对于所有评测用例,2n100010000问题分析有两种方法可以解决,一是用法;二是先对所有数据进行排序,然后求abs()stdlib.h求最小值的初值要设置成最大值,原题中数最大值为10000,所以初值10000/*CCF201712-1最小差值#include<iostream>#include<algorithm>usingnamespacestd;constintN=1000;constintN2=10000;inta[N];int{int//cin>>for(inti=0;i<n;i++)cin>>a[i];//sort(a,a+//intmin=for(inti=1;i<n;i++){intd=a[i]-a[i-1];if(d<min)min=}//cout<<min<<return}问题描有n个小朋友围成一圈玩游戏,小朋友从1至n,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小n1k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋n=5,k=22463583给定n和k,请问最后获胜的小朋友为多少?输出一行,包含一个整数,表示获胜的小朋友。5374对于所有评测用例,1n1000,1k9。使用数组进行模拟,flag[]用于标记小朋友是否出局,flag[i]=falsei+1,flag[i]=truei+1/*CCF201712-2游戏usingnamespacestd;intmain(){intn,k;queue<int>q;//读入数据与队列初始化for(inti=1;i<=n;i++)//intno=0,while(!q.empty()){head=q.front();if(no%k==0||no%10==;}

printf("%d\n",return}问题描1瓶,或者每买5瓶送2瓶。请问最多可以得到多少瓶酱油。数倍,N300。输出一个整数,表示最多可以得到多少瓶酱油。5511/*CCF201709-1打酱油#include<stdio.h>constintONE=1;constintTWO=2;constintFIVE=5;constintTHREE=3;constintPRICE=10;intmain(void){intn,group1,group2,group3;scanf("%d",&n);group1=n/PRICE/group2=(n-group1*PRICE*FIVE)/PRICE/group3=(n-group1*PRICE*FIVE-group2*PRICE*THREE)/PRICE;printf("%d\n",group1*(FIVE+TWO)+group2*(THREE+ONE)+group3);return0;}问题描述(盒有一个学校的老师共用N个教室,按照规定,所有的都必须放在公共钥课的教室的去开门,上完课后,再将放回到盒中。盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的。一串没有固定的悬挂位置,但上有标识,所以老师们不会弄混。今天开始的时候是按从小到大的顺序放在盒里的有K位老师时间就是还时间,请问最终盒里面的顺序是怎样的?N,K开始上课的时间和上课的时长。可能有多位老师使用同一把,但是老师使用的时间不会。保证输入数据满足输入格式,你不用检查数据。5432214329还每个关键时刻后的状态如下(X表示空):21X345;时刻3后为1X3X5;时刻6后为143X5;9331430%的评测用例,1N,K10,1wN,1s,c30;60%的评测用例,1≤N,K≤50,1≤w≤N,1≤s≤300,1≤c≤对于所有评测用例,1N,K1000,1wN,1s10000,1c100。2/*CCF201709-2公共盒#include<iostream>#include<queue>#include<stdio.h>//#defineDEBUGusingnamespacestd;struct_node{int //char //操作:'G'-取,'R'-还int //booloperator<(_node{if(time!=returntime>a.time;elseif(op!=a.op)returnop<}

returnnum>constintN=1000;inthook[N+1];int{intn,k;intw,s,c;priority_queue<_node>_nodescanf("%d%d",&n,&k);for(inti=1;i<=n;i++)hook[i]=#ifdefprintf("status:");for(inti=1;i<=n;i++)printf("%d",hook[i]);for(inti=1;i<=k;i++){scanf("%d%d%d",&w,&s,&c);t.num=w;t.time=s;t.op='G';t.op='R';t.time=s+c;}while(!q.empty()){t=q.top();if(t.op=='G')for(inti=1;i<=n;i++){if(hook[i]==t.num){hook[i]=0;}}}else{//t.op==for(inti=1;i<=n;i++){if(hook[i]==0){hook[i]=t.num;}}}#ifdefprintf("status:");for(inti=1;i<=n;i++)printf("%d",hook[i]);}for(inti=1;i<=n;i++){if(i!=1)printf("");printf("%d",hook[i]);}return}问题描述(分蛋糕,今天生日他有n块蛋糕要分给朋友们吃这n块蛋(为1到n)的重量分别为a1, a2,…,an。想分给每个朋友至少重量为k的蛋糕。的朋友们已经排好队准备领蛋糕,对于每个朋友总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中最小的给他直到的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。,请问当的蛋糕分完时,总共有多少个朋友分到了蛋糕。输入的第一行包含了两个整数n, 第二行包含n个正整数,依次表示 a2, an6265633对于所有评测用例,1≤n≤1000,1≤k≤10000,1≤ai1000/*CCF201703-1分蛋糕#include<stdio.h>intmain(void){intn,k,count=0,val,scanf("%d%d",&n,while(n--)scanf("%d",&val);if((sub+=val)>=k){sub=0;}}if(sub>printf("%d\n",count);return0;}问题描述(学生排队体育老师要将自己班上的学生按顺序排队他首先让学生按学号从小到让一位同学出队,向前或者向后移动一段距离后再队列。80)1,2,3,4,5,6,7,第一次调整,命令为“3号同学向后移动2”,表示3号同学出队,向后3,6,7,8,3,6,5,8,6,7m,表示调整的次数。mp,q,qpq,qpq。83328-3-1243586对于所有评测用例,1≤n ≤1000,1≤ 问题分析引,pos2sno[i]=ssi。这个程序应该是最快速的版本。数组pos2sno[]用于各个所在的位置上的学生(学号),pos2sno[i]=s表示学生s位于位置i。这个方法是直接进行模拟。其缺点是每次需要找到指定list(链表)STL/*CCF201703-2学生排队#include<iostream>#include<vector>usingnamespacestd;vector<int>v;intfind(int{intret=-for(inti=0;i<(int)v.size();i++)if(v[i]==x)returnreturn}int{intn,m,p,//cin>>n>>//for(inti=1;i<=n;i++)//for(inti=1;i<=m;i++){cin>>p>>q;intpos=v.insert(v.begin()+pos+(q>0?q+1:q),v.erase(v.begin()+pos+(q<0?1:}//cout<<for(inti=1;i<(int)v.size();i++)cout<<""<<v[i];cout<<return}问题描述(中间数a1,a2,…,an第二行包含n个正整数,依次表示a1, a2,…, 如果约定序列的中间数存在,则输出中间数的值,否则输出-表示不存在中间 4346-53466-对于所有评测用例,1 n≤1000,1 ≤1000问题分析对n个数进行排序,找出中间那个数,然后将中间那个数的左右与其相等2/*CCF201612-1中间数#include<iostream>#include<algorithm>usingnamespacestd;constintN=1000;intval[N];int{intn,mid,leftcount,//cin>>for(inti=0;i<n;i++)cin>>val[i];//sort(val,//mid=n/2;leftcount=mid;rightcount=n-mid-//for(inti=mid-1;i>=0;i--)if(val[i]==//for(inti=mid+1;i<n;i++)if(val[i]==//if(leftcount==rightcount)cout<<val[mid]<<endl;cout<<-1<<return}问题描的公司每个月给发工资而拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为SA=S-3500A1500A15004500A45009000A900035000A3500055000A5500080000A80000例如,如果的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-7459255已知这个月税后所得为T元,请问他的税前工资S是多少元。输入的第一行包含一个整数T,表示的税后所得。所有评测数据保证小输出一个整数S,表示的税前工资。对于所有评测用例,1≤ ≤100000/*CCF201612-2工资计算#include<iostream>usingnamespacestd;//#defineintsalaryrange[]={3500, , , , , inttaxrate[]={3,10,20,25,30,35,constintSIZE=sizeof(salaryrange)/sizeof(int);intrange[SIZE];int{intt,//计算各种收入范围range[0salaryrange[0];for(inti=1;i<SIZEi++)range[i]=range[i-1]+(salaryrange[i]-salaryrange[i--(salaryrange[i]-salaryrange[i-1])*taxrate[i-1]/}#ifdeffor(inti=0;i<SIZE;i++)cout<<range[i]<<"";cout<<endl;//cin>>//intfor(i=0;i<SIZE;i++)if(t<=range[i])//if(i==s=t;else{s=salaryrange[i-1]+(t-range[i-1])*100/(100-taxrate[i-}//cout<<s<<return}问题描述(最大波动数正在利用的波动程度来研究拿到了一只每天收盘时输入的第一行包含了一个整数n,表示拿到的收盘价格的连续天数。n输出一个整数,表示这只这n天中的最大波动值。6255734第四天和第五天之间的波动最大,波动值为|3-7|=4对于所有评测用例,2≤ ≤1000。每一天的价格为1到n/*CCF201609-1最大波动#include#defineMAX(x,y)((x>y)?(x):(y))intmain(void){intn,,second,delta,//scanf("%d%d",&n,&);while(--n) 2nscanf("%d",//求差值(波动值),delta=second-;delta=-maxval=MAX(maxval,=}//printf("%d\n",return}问题描述(火车购票96100购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以排在最小的几个空座位中(不考虑是否相邻)。假设初始时车票全部未被现在给了一些购票指令请你处理这些指令。n,第二行包含n个整数,每个整数p15之间,表示要购入的票数,相邻n对于购票指令p,输出p张车票 ,按从小到大排序425416789111213321、2561041114对于所有评测用例,1≤n ≤100,所有购票数量之和不超过100。map,处理逻辑可能稍微会复杂一些。/*CCF201609-2火车购票#include<iostream>#include<map>usingnamespacestd;constintN=20;constintNUM=5;intmain(){map<int,int>m;intn,v,start,end;//for(inti=1;i<=N;i++)m[i]=NUM;//cin>>for(inti=1;i<=n;i++)//输入数据:火车票张cin>>//分配车票(同一排分配)for(map<int,int>::iteratorit=m.begin();it!=m.end();it++){if(it->second>=v){//start=(it->-1)*NUM+1+(NUM-it->second);end=start+v-1;for(intj=start;j<=end;j++){if(j!=start)cout<<"";cout<<j;}cout<<//if(it->second==v)it->second=it->second-v=}}//分配车票(多排分配)boolnoflag=false;while(v>0){for(map<int,int>::iteratorit=m.begin();it!=m.end();it++){if(it->second>=v){//start=(it->-1)*NUM+1+(NUM-it->second);end=start+v-1;for(intj=start;j<=end;j++){cout<<"";cout<<j; flag=}//if(it->second==v)it->second=it->second-v=}else//start=(it->-1)*NUM+1+(NUM-it->second);end=start+it->second-1;for(intj=start;j<=end;j++){cout<<"";cout<<j;noflag=true;}v=v-it-//}}cout<<}}return}15问题描述(折点数给定nn36给定n个整数a1, a2,…, ai-1≠ai。注意,如果两天不相邻,销售量可能相同。n第二行包含n个整数,用空格分隔,分别表示a1, a2,…, 75412362所有评测用例满足:1≤n /*CCF201604-1折点计数#include<stdio.h>#defineN1000inta[N];int{intn,i,//读入数据scanf("%d",&n);for(i=0i<nscanf("%d",//count=for(i=1;i<n-1;if((a[i-1]<a[i]&&a[i]>a[i+1])||(a[i-1]>a[i]&&a[i]<a[i+1]))//printf("%d\n",return}问题描的各位数字之和为+0+1+5+1+2+2+0=13。所有评测用例满足:0≤ ≤1000000000问题描述(数列分段n,第二行包含n个整数a1,a2,…, 88880121285888,0,121281 ≤1000,0 ai≤1000/*CCF200512-1数位之和#include<stdio.h>intmain(void){intn,//scanf("%d",//while(n)sum+=n%10;n/=10;}//输出结果printf("%d\n",sum);return0;}问题描述(图像旋转90输入的第一行包含两个整数n, 接下来n行每行包含m个整数,表示输入的图像。231 ≤1,000,1000/*CCF201503-1图像旋转#include<stdio.h>#defineN1000intmatrix[N][N];int{intn,//输入矩阵scanf("%d%d",&n,&m);for(inti=0;i<n;i++)for(intj=0;j<m;scanf("%d",//for(intj=1;j<=m;j++){for(inti=0;i<n;i++){if(i!=putchar('');printf("%d",matrix[i][m-j]);}}return}问题描述(门禁系统涛涛最近要负责馆的管理工作,需要记录下每天读者的到访情况。每位n,第二行包含n个整数,依次表示涛涛的记录中每位读者的。5121111231≤n≤1,000,读者的为不超过n的正整数。n,nn一是用数组进行统计。由于读者

温馨提示

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

评论

0/150

提交评论