题目来源:欢乐的跳 - 洛谷
解题思路:
-
初始化:定义一个静态数组
a
来存储输入的整数,和一个布尔数组difs
来跟踪哪些差的绝对值已经出现过。 -
读取输入:通过循环从标准输入读取数组的大小
n
和n
个整数,存储在数组a
中。 -
计算并检查差的绝对值:对于数组
a
中的每对连续元素,计算它们之间的差的绝对值,并检查这个差值是否在1到n-1的范围内。如果是,就在difs
数组中对应位置标记为true
。 -
验证“欢乐的跳”:遍历
difs
数组,确保从1到n-1的每个差值都已经出现过。如果所有差值都出现过,则数组符合“欢乐的跳”的定义;否则,不符合。 -
输出结果:根据数组是否符合“欢乐的跳”,输出相应的结果
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1000; // 定义常量maxn,表示数组的最大长度
// isJolly函数检查数组是否为“欢乐的跳”
bool isJolly(int a[], int n) {
bool difs[maxn] = { false }; // 初始化一个布尔数组difs,用来记录每个可能的差值是否出现过
for (int i = 0; i < n - 1; ++i) { // 遍历数组中的每对连续元素
int dif = abs(a[i] - a[i + 1]); // 计算相邻元素之间的差的绝对值
if (dif >= 1 && dif < n) { // 如果差的绝对值在1到n-1之间
difs[dif] = true; // 在difs数组中标记该差值已出现
}
}
for (int i = 1; i < n; ++i) { // 检查difs数组,确保所有从1到n-1的差值都已出现
if (!difs[i]) { // 如果有任何一个差值没有出现
return false; // 则数组不是“欢乐的跳”
}
}
return true; // 所有差值都出现过,数组是“欢乐的跳”
}
int main() {
int n, a[maxn]; // n存储数组的长度,a是存储数组元素的静态数组
while (cin >> n) { // 读取n,直到没有更多输入
for (int i = 0; i < n; i++) { // 读取n个整数到数组a中
cin >> a[i];
}
if (isJolly(a, n)) { // 调用isJolly函数检查数组a是否是“欢乐的跳”
cout << "Jolly" << endl; // 如果是,则输出"Jolly"
}
else {
cout << "Not jolly" << endl; // 如果不是,则输出"Not jolly"
}
}
return 0;
}