前言
21年编程题相对来说比较简单,拿满分不难,22年编程题难度略有提升,主要区别在于最后一道编程题,21年是一道简单递推,22年最后一道用到了dfs回溯实现指数型子集枚举
或者迭代(二进制优化)实现指数型子集枚举
。
一、马鞍点
#include <iostream>
using namespace std;
const int N = 15;
int g[N][N], n, m;
bool is_maan(int a, int b)
{
int x = a, y = b;
for (int i = 1; i <= n; i ++)
if (g[i][b] < g[a][b]) // 在该列最小
return false;
for (int j = 1; j <= m; j ++)
if (g[a][j] > g[a][b]) // 在该行最大
return false;
return true;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
scanf("%d", &g[i][j]);
bool flag = false;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (is_maan(i, j))
{
printf("%d %d %d\n", i, j, g[i][j]);
flag = true;
}
if (!flag) puts("NO");
return 0;
}
二、完美数
问题描述
完美数的定义——如果一个大于 1 1 1 的正整数的所有因子之和等于它的本身,则称这个数是完美数,比如 6 6 6, 28 28 28 都是完数: 6 = 1 + 2 + 3 6=1+2+3 6=1+2+3; 28 = 1 + 2 + 4 + 7 + 14 28=1+2+4+7+14 28=1+2+4+7+14。同时完全数也满足 2 p − 1 ∗ ( 2 p − 1 ) 2^{p-1}*(2^p-1) 2p−1∗(2p−1)的形式,其中 p p p为素数,例如: 6 = 2 1 ∗ ( 2 2 − 1 ) 6=2^1*(2^2-1) 6=21∗(22−1)
输入说明
给定一个正整数 n n n
输出说明
输出两行,如果 n n n 是完美数,返回 t r u e true true,否则返回 f a l s e false false,并在第二行按照从小到大的顺输出 10000 10000 10000 内的完全数(以空格分隔)。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
bool is_perfect(int n)
{
int res = 0;
for (int i = 1; i < n; i ++)
if (n % i == 0)
res += i;
return res == n;
}
bool is_prime(int x) // 判定质数
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
return false;
return true;
}
int main()
{
int n;
cin >> n;
if (is_perfect(n)) puts("true");
else puts("false");
for (int i = 1; i <= 10000; i ++)
if (is_prime(i))
cout << pow(2, i - 1) * (pow(2, i) - 1) << endl;
return 0;
}
三、机器人的复制
问题描述
虚拟机器人复制,第一天生产一个成熟机器人,成熟机器人每天可生产一个新机器人,新机器人 3 3 3 天可变成成熟机器人,机器人个数和天数的关系如下:
天数 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
机器人数 | 1 | 2 | 3 | 4 | 6 | 9 |
输入描述
第 n n n 天( n < = 100 n<=100 n<=100 的自然数)
输出描述
第 n n n 天时机器人总数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n, f[N]; // f[i]表示第i天机器人的个数
int main()
{
cin >> n;
// 前三天只有第一天的成熟机器人在繁殖
for (int i = 0; i <= 3; i ++)
f[i] = i;
// 第i天机器人的个数 = 前一天所有机器人的个数 + 三天前所有机器人的个数(即成熟机器人的个数)
// 即f[i] = f[i -1] + f[i - 3];
for (int i = 4; i <= 100; i ++)
f[i] = f[i -1] + f[i - 3];
cout << f[n] << endl;
return 0;
}