有趣的跳跃(循环判断)

有趣的跳跃

一个长度为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

阅读题目可知,一段数字中相邻两个数的绝对值差可以排成序列,可以有以下思路:

  1. 假设一个成立的结果,预定有有趣的序列
  2. 设一个a[1]-[n-1]记录差值出现的次数
  3. 依次判断每次出现的值(1)范围不在1-(n-1)的 (2)出现重复次数的
  4. 序列中只有单个元素也是满足条件!

先假设满足条件

bool flag=0;
    scanf("%d",&n);//输入序列的长度
	for(int i=1;i<=n;i++){    
    scanf("%d",&b[i]);
    }    //依次输入序列的每位元素

设立一个temp来存放差值

abs()函数主要是对int求绝对值

fabs()对float,double求绝对值

abs()包含在头文件中,fabs()包含在头文件中。

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
#include
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");		
}

 

你可能感兴趣的:(c++)