失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > NHOI小甲解题思路

NHOI小甲解题思路

时间:2024-08-13 20:04:43

相关推荐

NHOI小甲解题思路

第一题 打印方阵

题目描述

下面这样的方阵很有规律,称为蛇形方阵。例如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小甲解题思路》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。