有趣的跳跃
一个长度为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
阅读题目可知,一段数字中相邻两个数的绝对值差可以排成序列,可以有以下思路:
- 假设一个成立的结果,预定有有趣的序列
- 设一个a[1]-[n-1]记录差值出现的次数
- 依次判断每次出现的值(1)范围不在1-(n-1)的 (2)出现重复次数的
- 序列中只有单个元素也是满足条件!
先假设满足条件
bool flag=0;
scanf("%d",&n);//输入序列的长度
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
} //依次输入序列的每位元素
设立一个temp来存放差值
abs()函数主要是对int求绝对值
fabs()对float,double求绝对值
abs()包含在<stdlib.h>头文件中,fabs()包含在<cmath>头文件中。
for(int i=2;i<=n;i++){ //循环n-1次存放差值
int tmp=fabs(b[i]-b[i-1]); //后一位减去前一位取绝对值
开始判断思路3里的两种情况
if(tmp>=n||tmp==0) //如果范围不在1-(n-1)当中
{flag=1;break;} //不满足
a[tmp]++; //用a数组来存放出现重复的情况
if(a[tmp]>1) //如果出现差值重复的情况
{flag=1;break;} //不满足
最后对满足的情况做一个判断
if(n==1||flag==0) //满足单独元素和成立的情况,输出jolly
printf("Jolly\n");
else //不满足的情况
printf("Not jolly");
整体代码
#include<cstdio>
#include<cmath>
const int maxn=3010;
int n,m,a[maxn],b[maxn];
bool flag=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=2;i<=n;i++){
int tmp=fabs(b[i]-b[i-1]);
if(tmp>=n||tmp==0){flag=1;break;}
a[tmp]++;
if(a[tmp]>1){flag=1;break;}
}
if(n==1||flag==0)
printf("Jolly\n");
else
printf("Not jolly");
}