07:有趣的跳跃
- 描述
一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。
- 输入
一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。
- 输出
一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"。
- 样例输入
4 1 4 2 3
- 样例输出
Jolly
题目分析:题目中涉及到排序,我这里采用的是冒泡排序
源代码
#include<iostream>
#include<cmath>
//定义一个交换函数
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int n,a[3000];
std::cin >> n;
if (n == 1)
{
std::cout << "Jolly";
return 0;
}
//输入数据
for (int i = 0; i < n; i++)
{
std::cin >> a[i];
}
//取相邻项之间的绝对值
for (int i = 0; i < n - 1; i++)
{
a[i] = abs(a[i + 1] - a[i]);
}
//进行冒泡排序,并进行了一点小优化
for (int i = 0; i < n-1; i++)
{
bool b = true;
for (int j = 0; j < n-2; j++)
{
if (a[j] > a[j + 1])
{
swap(a + j, a + j + 1);
b = false;
}
}
if (b)
break;
}
//判断数据
bool b = true;
for (int i = 0; i < n - 1; i++)
{
if (a[i] != i + 1)
{
b = false;
}
}
if (b)
{
std::cout << "Jolly";
}
else
{
std::cout<<"Not jolly";
}
return 0;
}