「CJOJ2725」Wave

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;
}

原文地址:https://www.cnblogs.com/cjgjh/p/9371647.html