[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
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 int N; 6 int A[10001]; 7 8 int main() { 9 int tmp; 10 while (scanf("%d", &N) != EOF) { 11 memset(A, 0, sizeof(A)); 12 bool flag = false;; 13 int min = 10000, max = 0; 14 for (int i = 0; i < N; ++i) { 15 scanf("%d", &tmp); 16 ++A[tmp]; 17 min = min > tmp ? tmp : min; 18 max = max > tmp ? max : tmp; 19 } 20 tmp = 0; 21 for (int i = min; i <= max; ++i) { 22 if (A[i] == 0) { 23 flag = false; 24 break; 25 } 26 tmp = A[i] - tmp; 27 if (tmp <= 0 && i != max) { 28 flag = false; 29 break; 30 } 31 if (tmp ==0 && i == max) { flag = true;} 32 } 33 if (flag) { 34 printf("YES\n"); 35 } else { 36 printf("NO\n"); 37 } 38 } 39 return 0; 40 } 41 42 /************************************************************** 43 Problem: 1377 44 User: hupo250 45 Language: C++ 46 Result: Accepted 47 Time:30 ms 48 Memory:1060 kb 49 ****************************************************************/