HDU - 6197 array array array

vj网址点击打开链接

这道题其实 当时打比赛的时候想到了 dp 但是但是看了数据范围是 O^2 看了一下数据范围 直接就 暴力交了一发 然后就t了 后来看了别人的代码 就是 二分 加上dp 然后dp 数组更新 这个思想 很简单 我记得以前 在刷 我们学校的oj的时候我还刷过 类似的题 但是当时 就是没有想起来 哎 想想自己就是菜鸡  然后 有个函数可以了解一下upper_bound 这个函数跟二分差不多 就是查找数组里面的数字 用着挺好  下面是ac代码

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<string>
#include<math.h>
using namespace std;
const int kk=1e5+100;
int p[kk];
int dp[kk];
int dpp[kk];
int main()
{
    int t,nn,mm,len1,len2,x;
    scanf("%d",&t);
    while(t--)
    {
        len1=len2=0;
        memset(dp,0,sizeof(dp));
        memset(dpp,0,sizeof(dpp));
        scanf("%d%d",&nn,&mm);
        for(int i=0; i<nn; i++)
        scanf("%d",&p[i]);
        //dp[len1]=-1000000,dpp[len2]=0x7f7f7f;
        for(int i=0; i<nn; i++)
        {
            if(dp[len1]<=p[i])
                dp[++len1]=p[i];
            else
            {
                x=upper_bound(dp+0,dp+len1,p[i])-dp;
               //  printf("%d\n",x);
                dp[x]=p[i];
            }
        }
        for(int i=nn-1;i>=0;i--)
        {
               if(dpp[len2]<=p[i])
                dpp[++len2]=p[i];
            else
            {
                x=upper_bound(dpp+0,dpp+len2,p[i])-dpp;
               //  printf("%d\n",x);
                dpp[x]=p[i];
            }
        }
        //printf("%d %d\n",len1,len2);
        if(nn-len1<=mm||nn-len2<=mm)
             printf("A is a magic array.\n");
        else
            printf("A is not a magic array.\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41071646/article/details/80011723
今日推荐