SAC E#1 - 一道神题 Sequence1

题目背景

小强和阿米巴是好朋友。

题目描述

小强很喜欢数列。有一天,他心血来潮,写下了一个数列。

阿米巴也很喜欢数列。但是他只喜欢其中一种:波动数列。

一个长度为n的波动数列满足对于任何i(1 <= i < n),均有:

a[2i-1] <= a[2i] 且 a[2i] >= a[2i+1](若存在) 或者

a[2i-1] >= a[2i] 且 a[2i] <= a[2i+1](若存在)

阿米巴把他的喜好告诉了小强。小强便打算稍作修改,以让这个数列成为波动数列。他想知道,能否通过仅修改一个数(或不修改),使得原数列变成波动数列。

输入输出格式

输入格式:

输入包含多组数据。

每组数据包含两行。

第一行一个整数n表示数列的长度。

接下来一行,n个整数,表示一个数列。

输出格式:

对于每一组输入,输出一行Yes或No,含义如题目所示。

输入输出样例

输入样例#1:
5
1 2 3 2 1
5
1 2 3 4 5
输出样例#1:
Yes
No

说明

对于30%的数据,n <= 10

对于另外30%的数据,m <= 1000

对于100%的数据,n <= 10^5,m <= 10^9

其中m = max|a[i]|(数列中绝对值的最大值)

模拟水题

只有两种情况:先上升还是先下降

判断不满足条件的数量要不大于1

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,cnt,flag1,flag2,dir;
 7 int a[100001];
 8 int main()
 9 {int i;
10   while (cin>>n)
11     {
12       for (i=1;i<=n;i++)
13     {
14       scanf("%d",&a[i]);
15     }
16       flag1=1;
17       dir=0;cnt=0;
18       for (i=2;i<=n;i++,dir=!dir)
19     {
20       if (a[i]!=a[i-1]&&(a[i]>a[i-1])!=dir)
21         if (++cnt>1) {flag1=0;break;}
22         else i++,dir=!dir;
23     }
24       flag2=1;
25       dir=1;cnt=0;
26       for (i=2;i<=n;i++,dir=!dir)
27     {
28       if (a[i]!=a[i-1]&&(a[i]>a[i-1])!=dir)
29         if (++cnt>1) {flag2=0;break;}
30         else i++,dir=!dir;
31     }
32       if (flag1||flag2) cout<<"Yes\n";
33       else cout<<"No\n";
34     }
35 }

 

posted @ 2017-10-07 20:17  Z-Y-Y-S  阅读(321)  评论(0编辑  收藏  举报