题目大意:
输入两个数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;
}
原文:http://www.cnblogs.com/imzscilovecode/p/7502626.html