最长不下降子序列
题目大意:
输入两个数n和k代表数组元素个数和可以删掉元素的个数,让你删掉k个数,如果存在一种方式删掉数之后序列是不下降或者不上升的,则输出A is a magic array.否则输出A is not a magic array.
基本思路:
最长上升子序列(不下降而已,略有不同);
反思与总结:
哎,不扎实啊,太菜了,还是看板子,手写写不出,难受,既如此,便要用命来干了(此言不虚);
代码如下:
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000+10; int ans[maxn]; int rec[maxn]; int main() { int T; scanf("%d",&T); while(T--) { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&ans[i]); } int len=1; rec[1]=ans[1]; for(int i=2;i<=n;i++) { if(ans[i]>=rec[len]) rec[++len]=ans[i]; else { int tmp=upper_bound(rec+1,rec+len+1,ans[i])-rec; rec[tmp]=ans[i]; } } if(len+k>=n) { printf("A is a magic array.\n"); } else { len=1; rec[1]=ans[n]; for(int i=n-1;i>=1;i--) { if(ans[i]>=rec[i]) rec[++len]=ans[i]; else { int tmp=upper_bound(rec+1,rec+len+1,ans[i])-rec; //左闭右开 rec[tmp]=ans[i]; } } if(len+k>=n) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } } return 0; }