1.题目
描述
一个长度为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
2.题目意思总结
从题目得知,要判断一个长度为n的序列中是否存在“有趣的跳跃”,需要对相邻两个元素的差进行冒泡排序,判断它们是否是从1到(n-1)。如果是,就存在“有趣的跳跃”。反之则不存在。
但如果这个数列只有一个元素,那么它也是存在“有趣的跳跃”的。
3.解题思路
1).输入数列。
2).相邻两数作差。
3).将差进行冒泡排序。
4).判断排序后的数列是否是从1到(n-1)。如果是,输出"Jolly",否则输出"Not jolly"。
4.代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[4000],b[4000],n,j,t=0;
cin>> n;
cin>> b[1];
for(int i=2;i<n+1;i++){//输入数列并作差
cin>> b[i];
a[i-1]=b[i-1]-b[i];
if(a[i-1]<0){
a[i-1]=a[i-1]/-1;
}
}
for(int k=1;k<=n-1;k++){//冒泡排序
for(int i=1;i<=n-k-1;i++){
if(a[i]>a[i+1]){
j=a[i+1];
a[i+1]=a[i];
a[i]=j;
}
}
}
for(int i=1;i<n;i++){//判断是否存在“有趣的跳跃”
if(a[i]==i){
t++;
}
}
if(t==n-1){
cout<<"Jolly";
}
else{
cout<<"Not jolly";
}
return 0;
}
5.重点总结
1).理解“有趣的跳跃”的含义。
2).正确编写冒泡排序程序。
标签:输出,1.6,07,int,存在,序列,跳跃,有趣 From: https://www.cnblogs.com/365760dqz/p/17535971.html