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 }