[Jobdu] 题目1377:缓变序列

时间:2023-03-09 16:38:57
[Jobdu] 题目1377:缓变序列
题目描述:
陈博在写论文时碰到一个难题:如何将给定的整数序列变换成缓变序列:即任意两个相邻的元素相差均为1,第1个元素和最后一个元素相差也为1. 变换是指改变原整数序列中各元素的顺序。例如整数序列1,3,2,2可以变换成缓变序列1,2,3,2. 其中(1,2)、(2,3)、(3,2)相差均为1,第1个元素和最后一个元素相差也为1.
陈博想了很长时间,纵然他英明神武,还是想让大家帮一个小忙:判断给定的整数序列能不能变换成缓变序列。
输入:
每个测试文件包含多个测试案例,每个测试案例两行,第一行包含一个整数N,代表原整数序列的长度,第二行是以空格隔开的N个整数,代表该整数序列。其中我们能保证2 <= N <= 10^5,每个整数大于等于1且小于等于10000.
输出:
对于每个整数序列,如果是缓变序列或者能够变换成缓变序列,输出YES,否则输出NO。
样例输入:
4
1 3 2 2
2
1 1
样例输出:
YES
NO
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8100-1-1.html
 #include <cstdio>
#include <cstdlib>
#include <cstring> int N;
int A[]; int main() {
int tmp;
while (scanf("%d", &N) != EOF) {
memset(A, , sizeof(A));
bool flag = false;;
int min = , max = ;
for (int i = ; i < N; ++i) {
scanf("%d", &tmp);
++A[tmp];
min = min > tmp ? tmp : min;
max = max > tmp ? max : tmp;
}
tmp = ;
for (int i = min; i <= max; ++i) {
if (A[i] == ) {
flag = false;
break;
}
tmp = A[i] - tmp;
if (tmp <= && i != max) {
flag = false;
break;
}
if (tmp == && i == max) { flag = true;}
}
if (flag) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return ;
} /**************************************************************
Problem: 1377
User: hupo250
Language: C++
Result: Accepted
Time:30 ms
Memory:1060 kb
****************************************************************/