array array array HDU - 6197

2018TYUT暑期ACM模拟赛(3)
array array array HDU - 6197
题意:给n,k,代表有n个数,可以最多有k次消除。使得最后的数字是上升的序列或者是下降的序列。
思路:这道题的另一个意思就是求,n个数的最长上升序列和最长下降序列。判断是否有一个可以满足 k >=(n-最长的长度)。
AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int dp[maxn];
int pd[maxn];
int a[maxn];
int b[maxn];
const int inf= 0x7f7f7f7f;
//zuichang 

int main()
{
    int t;
    int n,k;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            dp[i]=inf;
            pd[i]=inf;
        }
        for(int i=n-1;i>=0;i--)
            b[n-i-1]=a[i];

        for(int i=0;i<n;i++)
            *lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素,并用a[i]替换; 
        for(int i=0;i<n;i++)
            *lower_bound(pd,pd+n,b[i])=b[i];//找到<=a[i]的第一个元素,并用b[i]替换; 
        int ans1=lower_bound(dp,dp+n,inf)-dp;
        int ans2=lower_bound(pd,pd+n,inf)-pd;
        //cout<<ans1<<" "<<ans2<<endl;
        if((k>=n-ans1)||(k>=n-ans2)) cout<<"A is a magic array."<<endl;
        else cout<<"A is not a magic array."<<endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/miranda_ymz/article/details/81072405
今日推荐