2019NHOI小甲解题思路

本文介绍了2019年全国高中信息学竞赛的六道题目,包括打印蛇形方阵、分数减法、倒背如流、集合的差、可表示的数和叠罗汉问题的解题思路。解题方法涉及二重循环、数学知识、整数颠倒、标技数组、枚举模拟和贪心原理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题 打印方阵

题目描述

下面这样的方阵很有规律,称为蛇形方阵。例如 3*3 的:
1 2 3
6 5 4
7 8 9
现在给定边长,输出相应的蛇形方阵。 

输入:

1 个整数 n,表示要输出 n*n 的蛇形方阵, 1<=n <=100。 

输出:

n 行,每行 n 个整数,空格隔开。 

样例输入

4

样例输出 

1 2 3 4
8 7 6 5
9 10 11 12
16 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;
		else
			for(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,表示一个分数

### NHOI 第六题 题解 #### 平方因问题解析 此问题是关于计算区间 `[n, m]` 中不含有任何完全平方数作为因数的整数数量。以下是详细的解答过程: 程序的核心逻辑在于通过标记法筛除掉所有含平方因的数字,最后统计剩余未被标记的数字。 ```cpp #include <bits/stdc++.h> using namespace std; int main(){ long long n, m; cin >> n >> m; // 创建一个布尔数组用于标记是否为平方因 bool a[1000005]; memset(a, 0, sizeof(a)); // 对于每个可能的平方根i,将其平方倍数全部标记 for(long long i = 2; i * i <= m; ++i){ if(!a[i]){ for(long long j = i * i; j <= m; j += i * i){ a[j] = true; } } } // 统计[n, m]范围内不含平方因的数量 long long count = 0; for(long long k = n; k <= m; ++k){ if(!a[k]) { count++; } } cout << count; return 0; } ``` 以上代码实现了对给定区间的处理并输出结果[^4]。 #### 关键点解释 - **埃拉托色尼筛选法变体**:利用类似素数筛选的方法,将所有具有平方因的数标记出来。 - **时间复杂度分析**:由于外部循环仅运行至 `sqrt(m)`,内部循环每次跳跃步长为当前数的平方,整体效率较高,适合大规模数据处理需求[^4]。 --- ### 差值问题解析 另一个提到的相关题目涉及寻找特定差值组合数目。下面提供其解决方案: ```cpp #include <bits/stdc++.h> using namespace std; map<long long, long long> frequencyMap; long long resultCount = 0; int main(){ long long numberOfElements, differenceValue; cin >> numberOfElements >> differenceValue; for (long long index = 1; index <= numberOfElements; ++index){ long long currentElement; cin >> currentElement; if(differenceValue <= currentElement && frequencyMap.find(currentElement - differenceValue) != frequencyMap.end()){ resultCount += frequencyMap[currentElement - differenceValue]; } frequencyMap[currentElement]++; } cout << resultCount; return 0; } ``` 上述实现采用哈希表记录已读取数值频率,在线性时间内完所需查询操作[^2]。 #### 技巧说明 - 使用标准库中的`std::map`结构存储各元素出现次数以便快速检索匹配项。 - 边输入边判断策略有效减少内存占用同时保持算法高效执行特性[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值