Description
给定一个长度为n的数列,试求一个最长的不稳定波动子序列满足子序列任意偶数项的 值不小于其相邻两项的值,且相邻两项的差不小于k 。
Input
输入第一行两个正整数 n,k ;
第二行,n 个非负整数描述这个数列。
Output
输出一个整数即答案。
Sample Input
10 3
2 6 7 9 0 3 7 6 4 45
Sample Output
4
Hint
数据范围及约定
对于 30% 的数据,n<=1000 。
对于 70% 的数据,n<=100000 。
对于 100% 的数据,n<=(2∗10^6) , 数列中的数不超过 (2^31−1)。
题解
这道题目很皮啊,其实只要让偶数位的最大化,奇数位的尽量小,然后就是贪心AC了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
#define re register
#define ll long long
using namespace std;
inline int gi(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int maxn=10000010;
int ans[maxn],a[maxn];
int main(){
int i,j,k,n,m;
n=gi();k=gi();
for(i=1;i<=n;i++)a[i]=gi();
int cnt=1;
ans[cnt]=a[1];
for(i=2;i<=n;i++){
if(cnt%2){
if(a[i]<ans[cnt])ans[cnt]=a[i];
else if(a[i]-k>=ans[cnt])ans[++cnt]=a[i];
}
else{
if(a[i]>ans[cnt])ans[cnt]=a[i];
else if(a[i]+k<=ans[cnt])ans[++cnt]=a[i];
}
}
printf("%d
",cnt);
return 0;
}