第一题 打印方阵
题目描述
下面这样的方阵很有规律,称为蛇形方阵。例如3*3的:
1 2 3
6 5 4
7 8 9
现在给定边长,输出相应的蛇形方阵。
输入:
1个整数n,表示要输出n*n的蛇形方阵,1<=n <=100。
输出:
n行,每行n个整数,空格隔开。
样例输入
4
样例输出
1 2 3 48 7 6 59 10 11 1216 15 14 13
解题思路:送分题,这题的考点是二重循环,输出一个蛇形矩阵即可,使用一个标记变量记录当前所输出到的数据,然后判断行号的奇偶性,从左往右或者从右往左直接打表输出即可。附代码如下:
#include <bits/stdc++.h>using namespace std;int a[105][105],n,num;int main(){cin>>n;for(int i=0;i<n;i++){if(i%2==0)for(int j=0;j<n;j++)num++,a[i][j]=num;elsefor(int j=n-1;j>=0;j--)num++,a[i][j]=num;}for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<a[i][j]<<" ";cout<<endl;}return 0;}
第二题 分数减法
题目描述:
这样的分式运算我们都会。请编程计算两个分数相减的结果。
输入格式:
第一行2个整数a和b,表示一个分数,1<=a<b <=10000。
第二行2个整数c和d,表示一个分数,1<=c<d <=10000。
输入数据保证计算结果为正。
输出格式:
2个整数,表示结果。
提示: 运算结果分式要约分。
输入样例:
4 71 3
输出样例:
5 21
解题思路:这题的考点是数学知识,只要会如何编程求最大公约数与最小公倍数即可,先求两个分数中分母的最小公倍数进行通分,通分后,分子相减,最后通过结果中分子与分母的最大公约数进行约分。附代码如下:
#include <bits/stdc++.h>using namespace std;int a,b,c,d;int gcd(int x,int y)//求最大公约数{if(x%y==0)return y;return gcd(y,x%y);}int mcm(int x,int y)//求最小公倍数{return x*y/gcd(x,y);}int main(){cin>>a>>b>>c>>d;int fenmu=mcm(b,d);//结果的分母值 int fenzi=a*(fenmu/b)-c*(fenmu/d);//结果的分子值 int t=gcd(fenzi,fenmu);//分子和分母的最大公约数 cout<<fenzi/t<<" "<<fenmu/t;return 0;}
第三题 倒背如流
题目描述
黑板上老师写了一行N个正整数,老师要考同学们的倒背如流能力,让学生从右向左读这些数字,并求出他们的和。例如写了3个整数:123 45 60。结果是:06+54+321=381
输入格式:
第一行1个整数n,1<=n <=100。
第二行n个正整数,每个正整数不超过1000000。
输出格式:
一个整数
输入样例:
3123 45 60
输出样例:
381
解题思路:这题的考点是整数的颠倒,直接将输入的整数,数字颠倒后求和即可。附代码如下:
#include <bits/stdc++.h>using namespace std;int n,a,b; long long sum;int main(){cin>>n;for(int i=0;i<n;i++){cin>>a;b=0;while(a>0)//整数的颠倒{b=b*10+a%10;a/=10;}sum+=b;//求和}cout<<sum;return 0;}
第四题 集合的差
题目描述
有两个数列A和B,那些在A中出现但不在B中出现的数就称为集合A和集合B的差:A-B。例如:A={1 ,4, 5, 2, 6} ,B={ 5,3,2,7} ,那么A-B = {1,4,6}。
现在给你2个集合A和B,求A-B有多少个数。
输入格式:
第一行2个整数na和nb,表示集合A和集合B各有多少个整数,1<=na,nb<=10000。
第二行na个不同的正整数,表示集合A里的数,每个正整数不超过10000。第二行nb个不同的正整数,表示集合B里的数,每个正整数不超过10000。
输出格式:
一个整数,A-B里有多少数。
样例输入
5 45 2 4 8 73 7 6 2
样例输出
3
提示
A-B={5,4,8 }
解题思路:这题的考点是标技数组,题目要求出的是A集合的数字中,减去B集合中存在的A集合的数字;即求AB两个集合的差集,数据范围不大,直接使用两个标记数组进行比较即可。附代码如下:
#include <bits/stdc++.h>using namespace std;int Na,Nb,Useda[10005],Usedb[10005],ans;int main(){cin>>Na>>Nb;ans=Na;int x;for(int i=0;i<Na;i++){cin>>x;Useda[x]=1;//标记A集合}for(int i=0;i<Nb;i++){cin>>x;Usedb[x]=1;//标记B集合}for(int i=0;i<=10000;i++) if(Useda[i]==1&&Usedb[i]==1)//计算AB的差集ans--;cout<<ans;return 0;}
第五题 可表示的数
题目描述
有N个整数从左到右排成一行,如果某个数等于它前面的2个数的和,就称这个数是可以表示的数。问给定的数列里有多少个数是可以表示的数。
输入格式:
第一行1个整数N,表示数列有多少个整数。1<=N<=10000。
第二行N个正整数,每个正整数不超过10000。
输出格式:
一个整数,有多少可表示的数。
样例输入
85 2 2 3 4 8 7 16
样例输出
3
提示
样例解释
4=2+2; 8=5+3; 7=3+4
解题思路:这题的考点是标记数组与枚举模拟。因为数据范围不大,使用两重循环不会超时;直接在输入的同时使用循环模拟判断是否存在符合情况的数据,使用标记数组标记即可,要注意创建数组的大小,附代码如下:
#include <bits/stdc++.h>using namespace std;int n,x[10005],sum[20005],ans;int main(){cin>>n;for(int i=0;i<n;i++){cin>>x[i];if(sum[x[i]]==1)ans++;//判断是否存在两数和符合要求的情况for(int j=0;j<i;j++)sum[x[i]+x[j]]=1;//标记存在的情况}cout<<ans;return 0;}
第六题 叠罗汉
题目描述
农场的N头奶牛喜欢玩叠罗汉游戏,就是几头奶牛1头奶牛接着1头奶牛的站成一柱子形状。不过奶牛的力量不一样,用数值Ci表示第i头奶牛它的上面最多可以站多少头奶牛,问这些奶牛最少可以站成几个柱子形状。
输入格式:
第一行1个整数N,表示有多少头奶牛。1<=N<=1000。
第二行N个正整数Ci,表示这些奶牛的力量。0<=Ci<=1000。
输出格式:
一个整数,表示最少成几个“罗汉”。
样例输入
50 2 1 2 2
样例输出
2
提示
样例解释
可以第1、第3、第2头奶牛从上向下叠罗汉;第4、第5头奶牛叠罗汉。
解题思路:这题的考点是贪心原理,将承受重量最大的奶牛放在柱子的最下面,那么柱子的数量最少。先使用标技数组标记每一种承受重量牛的数量,然后再以承受重量,模拟将牛从上往下、承受重量从小到大把牛放到对应的位置即可。附代码如下:
#include <bits/stdc++.h>using namespace std;int n,a,c[1005],ans,gd; int main(){cin>>n;for(int i=0;i<n;i++){cin>>a;c[a]++;} for(int i=0;i<=1000;i++)//遍历所有高度 {while(c[i]>0){ans++;gd=0;for(int j=i;j<=1000;j++)while(c[j]>0&&j>=gd)//可以在底部插入 {c[j]--;gd++;}}}cout<<ans;return 0;}
如果觉得《NHOI小甲解题思路》对你有帮助,请点赞、收藏,并留下你的观点哦!