第一题:小艺学算法
题目描述
小艺是一名高中生,她喜欢研究算法。最近,她发现了一种奇特的排序方法:
将数组
A
A
A 中的所有元素按照奇偶性分为两个子数组
A
O
A_O
AO 和
A
E
A_E
AE。
对
A
O
A_O
AO 和
A
E
A_E
AE 分别使用冒泡排序进行排序。
将
A
O
A_O
AO 和
A
E
A_E
AE 合并起来,按照奇偶性从小到大的顺序排列。
例如,如果数组
A
A
A 为 [5, 3, 2, 4, 1],则
A
O
A_O
AO 为 [5, 3, 1],
A
E
A_E
AE 为 [2, 4]。使用冒泡排序后,
A
O
A_O
AO 变为 [1, 3, 5],
A
E
A_E
AE 变为 [2, 4]。最终,合并后的数组
A
A
A 为 [1, 2, 3, 4, 5]。
小艺希望你能帮她编写一个程序,实现这种排序方法。
输入格式
输入第一行包含一个整数 n n n,表示数组 A A A 的长度。
第二行包含 n n n 个整数,表示数组 A A A 的元素。
输出格式
输出一行 n n n 个整数,表示排序后的数组 A A A。
数据范围
1≤n≤100,
−109≤人工智能≤109
输入样例
5
5 3 2 4 1
输出样例
1 2 3 4 5
解题思路&C++题解
这道题的解题思路如下:
首先,读入数组
A
A
A 的长度
n
n
n 和元素。
然后,使用两个指针
i
i
i 和
j
j
j 分别扫描数组
A
A
A,将其中的奇数和偶数分别存到两个新的数组
A
O
A_O
AO 和
A
E
A_E
AE 中。
对
A
O
A_O
AO 和
A
E
A_E
AE 分别使用冒泡排序进行排序。
最后,使用两个指针
i
i
i 和
j
j
j 分别扫描
A
O
A_O
AO 和
A
E
A_E
AE,将其中的元素合并起来,按照奇偶性从小到大的顺序即可输出。
C++题解如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int a[N];
void bubble_sort(int *arr, int n)
{
for (int i = 0; i < n - 1; i ++ )
for (int j = 0; j < n - 1 - i; j ++ )
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i];
int a_o[N], a_e[N];
int cnt_o = 0, cnt_e = 0;
for (int i = 0; i < n; i ++ )
{
if (a[i] & 1) a_o[cnt_o ++ ] = a[i];
else a_e[cnt_e ++ ] = a[i];
}
bubble_sort(a_o, cnt_o);
bubble_sort(a_e, cnt_e);
int i = 0, j = 0;
while (i < cnt_o && j < cnt_e)
{
if (a_o[i] < a_e[j]) cout << a_o[i ++ ] << ' ';
else cout << a_e[j ++ ] << ' ';
}
while (i < cnt_o) cout << a_o[i ++ ] << ' ';
while (j < cnt_e) cout << a_e[j ++ ] << ' ';
return 0;
}
第二题:「超级难算法」
题目描述
小艺是一名资深的程序员,她最近在研究一种新的算法,这种算法称为「超级难算法」。超级难算法非常复杂,小艺希望通过编写一个程序来帮助自己理解这种算法。
超级难算法的输入是一个整数 n,输出是一个长度为 n 的数组 a,满足 a[i] = i^2 (i 从 0 开始)。
但是,超级难算法不止是要求出数组 a,还要求在输出数组 a 的同时,在屏幕上输出一个提示信息,提示信息的格式如下:
“超级难算法已经完成!n = [n],a = [a[0], a[1], …, a[n-1]]”
其中,[n] 和 [a[0], a[1], …, a[n-1]] 都要用实际的数字替换。
例如,当 n=5 时,超级难算法的输出应该是:
超级难算法已经完成!n = 5,a = [0, 1, 4, 9, 16]
小艺非常期待你能帮助她完成这道题。
请使用 c++ 编写一个程序,完成超级难算法的功能。
输入格式
输入只有一行,是一个整数 n,表示超级难算法的输入。
n 的范围是 1 到 10^9,保证 n 是一个正整数。
输入样例
5
输出格式
输出只有一行,是超级难算法的提示信息。
输出样例
超级难算法已经完成!n = 5,a = [0, 1, 4, 9, 16]
其他要求
程序中的变量和函数名都必须使用英文,不允许使用汉语或其他语言。
程序中不能使用任何第三方库,也不能使用 c++ 标准库中的任何函数。所有程序功能都必须由你自己实现。
你需要完成以下步骤:
-
在程序开头,使用 #include 指令引入头文件 iostream。
-
在主函数 main 中,定义一个整数变量 n,使用 cin 输入 n 的值。
-
在主函数 main 中,定义一个整型指针变量 a,使用 new 关键字动态分配内存,为 a 分配长度为 n 的数组。
-
在主函数 main 中,使用 for 循环遍历数组 a,并且使用超级难算法的公式计算出 a[i] 的值。
-
在主函数 main 中,使用 cout 输出超级难算法的提示信息。
-
在主函数 main 的最后,使用 delete 关键字释放 a 所占用的内存。
-
在程序结尾,使用 return 0;结束程序。
解题思路&C++题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int *a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i * i;
}
cout << "超级难算法已经完成!n = " << n << ",a = [";
for (int i = 0; i < n; i++) {
cout << a[i];
if (i < n - 1) {
cout << ", ";
}
}
cout << "]" << endl;
delete[] a;
return 0;
}
该代码实现了超级难算法的功能,输入了一个整数 n,然后使用动态内存分配为数组 a 分配了长度为 n 的空间,并使用 for 循环遍历数组 a,并使用超级难算法的公式计算出 a[i] 的值。最后,输出了超级难算法的提示信息,并释放了 a 所占用的内存。