题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197
题意:给你一个长度为n的数组,如果能从这个数组里删除k个元素,使得这个数组成为不严格的单调递增序列,或不严格单调递减序列,那么这个数组就是魔法数组,否则就不是
解析:其实看懂了题真的挺好做的,看不懂那就连样例都看不懂了,对于这题,对于递增的情况来说,求他的最长上升子序列的长度,判断他的长度+k是否大于等于n,如果小于n的话,就算拿走k个元素,还是不符合魔法数组,对于递减情况来说是一样的
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
const int inf = 0x7fffffff;
int dp[maxn];
int a[maxn];
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
fill(dp,dp+n,inf);
for(int i=0;i<n;i++)
*lower_bound(dp,dp+n,a[i]) = a[i];
int t1 = lower_bound(dp,dp+n,inf)-dp;
fill(dp,dp+n,inf);
for(int i=n-1;i>=0;i--)
*lower_bound(dp,dp+n,a[i]) = a[i];
int t2 = lower_bound(dp,dp+n,inf)-dp;
n -= k;
if(t1>=n || t2>=n)
puts("A is a magic array.");
else
puts("A is not a magic array.");
}
return 0;
}