收集相邻差的绝对值,用集合判断其是否恰好为 1 到 n-1。
OJ: noi_openjudge
题目 ID: ch0106-07
难度:普及-
标签:数组集合模拟python
日期: 2026-07-30 23:01
题意
若长度为 Jolly,否则输出 Not jolly。
思路
用 zip(numbers, numbers[1:]) 枚举相邻对,收集绝对差到集合。若集合恰好等于 set(range(1, length)),说明每个要求的差都出现过且没有重复或越界值。
当 Jolly。
代码
Python代码
python
data = list(map(int, input().split()))
length, numbers = data[0], data[1:]
differences = {abs(right - left) for left, right in zip(numbers, numbers[1:])}
print("Jolly" if differences == set(range(1, length)) else "Not jolly")C++代码
cpp
#include <cstdio>
/* 对差值进行记数 ,a[1] = 1*/
int cnt[3005] = {0};
int main(){
int n;
scanf("%d",&n);
int i;
int a,b;
scanf("%d",&a);
for (i=2;i<=n;i++){
scanf("%d",&b);
int cha = b - a;
if( cha < 0)
cha = -cha;
cnt[cha]++;
a = b;
}
for(i=1;i<=n-1;i++){
if( cnt[i] != 1){
printf("Not jolly");
return 0;
}
}
printf("Jolly");
return 0;
}复杂度
时间复杂度为
总结
判定一组值是否刚好构成目标集合时,集合相等比较简洁且能同时检查重复。