
目录A.数组练习1B.田忌赛马C.梦中的统计D.小明不会数E.不要质数F.统计天数G.东风夜放花千树H.矩阵乘法I.有强迫症的小明IIJ.有强迫症的小明IIIK.小帅的幻想L.杨辉三角M.斐波那契N.快乐数组O.树的质量IP.树的质量IIQ.树的质量IIIR.小B数数S.小风的课(easy)T.小风的课(middle)U.你好 泥嚎 nihaoV.MEX(easy version)W.MEX(hard version1)X.MEX(hard version2)A.数组练习1没什么好说的,就是正着输入,用数组存一下,然后倒着输出ACcode#includestdio.hintmain(){intn;inta[1010];//尽量比题里的限制开的略大一点scanf("%d",n);for(inti=0;in;i++)scanf("%d",a[i]);//正着输入for(inti=n-1;i=0;i--)printf("%d ",a[i]);//倒着输出return0;}B.田忌赛马田忌采取的策略是:用最差的马对抗达奇最好的马,用次差的马对抗次好的马,… ,最后用最好的马对抗达奇最差的马。开两个数组,a数组存田忌的马,b数组存达奇的马,然后开一个循环,每次将田忌的马正序输出,将达奇的马逆序输出就好了。这题题干里面说了,马夫已经把两人的马按照实力排好了顺序,所以直接输入就行,不用排序ACcode1#includestdio.hinta[200005],b[200005];intmain(){intn;scanf("%d",n);for(inti=0;in;i++)scanf("%d",a[i]);//田忌的马for(inti=0;in;i++)scanf("%d",b[i]);//达奇的马for(inti=0;in;i++){printf("%d %d\n",a[i],b[n-1-i]);}return0;}当然,你也可以将达奇的马逆序存储,然后他俩都正序输出就好了ACcode2#includestdio.hinta[200005],b[200005];intmain(){intn;scanf("%d",n);for(inti=0;in;i++)scanf("%d",a[i]);//田忌的马for(inti=n-1;i=0;i--)scanf("%d",b[i]);//达奇的马for(inti=0;in;i++){printf("%d %d\n",a[i],b[i]);}return0;}C.梦中的统计就是输入两个数m,n(注意:范围比较大,有可能会爆int),用一个for循环遍历m~n中的每一个数,用while循环把每个i的每一位取出来(这里记得用一个变量替换i,否则会死循环),用一个长度为10的cnt数组来存每一个数字出现的次数,cnt[i]就是数字i出现的次数,因为下标是0~9,所以长度开到10刚好,把每个位置初始化成0,每次对while循环取出的余数在数组中对应的位置+1,(cnt[t%10]++),然后for循环从0到9遍历一遍输出就好了需要注意:因为while循环的判断条件为t!=0,所以0不会进入while循环,就不会加到答案中,要特判这种情况。ACcode#includestdio.hintcnt[10];//计数数组,cnt[i]表示i出现的次数intmain(){longlongm,n;scanf("%lld%lld",m,n);for(longlongi=m;i=n;i++){//i遍历m~n的每一个数longlongt=i;//用t代替i取位,防止死循环if(i==0)cnt[0]++;//特判0的情况while(t){//while循环取出t(i)的每一位cnt[t%10]++;//将取出来的数字累加到计数数组中t/=10;}}for(inti=0;i10;i++){printf("%d ",cnt[i]);//遍历数组,输出结果}return0;}D.小明不会数这题和梦中的统计那题一样,也是用一个cnt数组来计数,就是输入n个数,然后对每个数给cnt数组对应的位置+1,再用一个for循环把cnt[1]~cnt[30]输出就好了这题有两个地方需要注意:1.这题是多组输入,每次要对cnt进行初始化,建议直接将cnt定义在while(T--){}内部,方便直接初始化。2.仔细读题,这题虽然只让你输出1~30,但它的数据范围是1~100,因此cnt数组要开到100以上,否则会数组越界ACcode#includestdio.hintn;intmain(){intT;scanf("%d",T);while(T--){//多组输入intcnt[105]={0};//定义并初始化cnt计数数组,用来统计每个数出现的次数scanf("%d",n);for(inti=0;in;i++){//循环n次,intx;scanf("%d",x);//也就是输入n个数cnt[x]++;//x的出现次数+1}for(inti=1;i=30;i++){//for循环从cnt[1]~cnt[30]遍历printf("%d ",cnt[i]);//输出数字i出现的次数}printf("\n");//多组输入,一组输出占一行,别忘换行}return0;}E.不要质数输入n个数,因为要逆序输出,所以要用数组存起来,定义一个计数的变量cnt,用来存替换掉了几个数,初始化为0,依次判断每个数是不是质数,是质数就把这个数换成-1,并且给cnt加一,最后将数组逆序输出,换行输出cnt就好了ACcode#includestdio.hinta[1010];intmain(){intn;intcnt=0;//初始化计数变量,cnt表示替换掉了多少个数scanf("%d",n);for(inti=0;in;i++){//循环执行n次,scanf("%d",a[i]);//输入n个数intflag=1;//判断质数模板for(intj=2;j*j=a[i];j++){if(a[i]%j==0){flag=0;break;}}if(flag==1){//如果a[i]是质数a[i]=-1;//就把它换成-1cnt++;//计数变量+1}}for(inti=n-1;i=0;i--){//逆序遍历数组aprintf("%d ",a[i]);//逆序输出这n个数}printf("\n%d",cnt);//换行,输出被替换掉的数的个数return0;}F.统计天数定义一个变量,用来存储最长连续上升天数(最后的结果),因为最少也有一天,所以把res初始化成1,for循环从第0天~第n-1天遍历,用一个变量来存当前连续上升的天数,每次比较第i天和第i+1天的气温,如果前一天的气温较低,就说明气温升高,就给气温连续上升的天数+1(cnt++),同时更新最大值,否则就说明气温上升断了,就要让天数再从1天开始加(cnt=1)。ACcode#includestdio.hinta[1000005];intmain(){intn;intres=1;// 初始化结果为1,因为最少有1天scanf("%d",n);for(inti=0;in;i++){scanf("%d",a[i]);// 循环读入n天的气温}intcnt=1;// cnt用于统计当前连续上升的天数for(inti=0;in-1;i++){// 遍历数组寻找最长上升天数if(a[i]a[i+1]){cnt++;// 如果后一天温度比当前天高,连续上升天数加1if(cntres)res=cnt;// 每次计数增加时都要更新最大值}// 如果不是上升,重置cnt的值,重新从1天开始加else{cnt=1;}}// 输出结果printf("%d",res);return0;}G.东风夜放花千树就是一个n*m的二维数组,改变t个指定位置的值,最后输出对应的字符ACcode#includestdio.hinta[105][105];//把数组放到全局,值全初始化成0intmain(){intn,m;scanf("%d%d",n,m);intt;scanf("%d",t);while(t--){intx,y;scanf("%d%d",x,y);a[x][y]=1;//将'*'的位置改成1}//输出地图for(inti=1;i=n;i++){for(intj=1;j=m;j++){if(a[i][j]==1)printf("*");//如果这个位置是1,就输出'*'elseprintf(" ");//是0就输出' '}printf("\n");//记得换行}return0;}但这题有一点需要注意:有人想用char类型的数组来做这题,初始化时想全部初始化成空格:char[105][105] = {' '};这样不行,因为空格的ascl码是32,但不完全初始化实际是将除了第一个字符的所有位置都初始化成0,所以除了第一个字符以外的每个位置都根本不是空格,就错了。这题的彩蛋H.矩阵乘法这题就是按题意模拟矩阵乘法的过程,直接按照题中的公式循环遍历即可ACcode#includestdio.h// 定义两个最大尺寸为 500x500 的矩阵inta[505]