- 题目描述:
-
陈博在写论文时碰到一个难题:如何将给定的整数序列变换成缓变序列:即任意两个相邻的元素相差均为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
");
35 } else {
36 printf("NO
");
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 ****************************************************************/