HDU 6197array array array(简单dp)

来源:互联网 发布:网站域名申请流程 编辑:程序博客网 时间:2024/06/05 02:39

array array array

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 341    Accepted Submission(s): 214


Problem Description
One day, Kaitou Kiddo had stolen a priceless diamond ring. But detective Conan blocked Kiddo's path to escape from the museum. But Kiddo didn't want to give it back. So, Kiddo asked Conan a question. If Conan could give a right answer, Kiddo would return the ring to the museum. 
Kiddo: "I have an array A and a number k, if you can choose exactly k elements from A and erase them, then the remaining array is in non-increasing order or non-decreasing order, we say A is a magic array. Now I want you to tell me whether A is a magic array. " Conan: "emmmmm..." Now, Conan seems to be in trouble, can you help him?
 

Input
The first line contains an integer T indicating the total number of test cases. Each test case starts with two integers n and k in one line, then one line with n integers: A1,A2An.
1T20
1n105
0kn
1Ai105
 

Output
For each test case, please output "A is a magic array." if it is a magic array. Otherwise, output "A is not a magic array." (without quotes).
 

Sample Input
34 11 4 3 75 24 1 3 1 26 11 4 3 5 4 6
 

Sample Output
A is a magic array.A is a magic array.A is not a magic array.
 

Source
2017 ACM/ICPC Asia Regional Shenyang Online
想法:递增递减子序列
代码:
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int a[100005],dp[100005],n;int bin(int size,int k){    int l = 1,r = size;    while(l<=r)    {        int mid = (l+r)/2;        if(k>dp[mid])            l = mid+1;        else            r = mid-1;    }    return l;}int LIS(){    memset(dp,0,sizeof(dp));    int i,j,ans=1;    dp[1] = a[1];    for(i = 2; i<=n; i++)    {        if(a[i]<=dp[1])            j = 1;        else if(a[i]>dp[ans])            j = ++ans;        else            j = bin(ans,a[i]);        dp[j] = a[i];    }    return ans;}int LIS1(){    memset(dp,0,sizeof(dp));    int i,j,ans=1;    dp[1] = a[1];    for(i = 2; i<=n; i++)    {        if(a[i]>dp[1])            j = 1;        else if(a[i]<=dp[ans])            j = ++ans;        else            j = bin(ans,a[i]);        dp[j] = a[i];    }    return ans;}int main(){    int T;    scanf("%d",&T);    while(T--)    {      int k;      scanf("%d %d",&n,&k);      for(int i=1;i<=n;i++)      {          scanf("%d",&a[i]);      }     int ans1=n-LIS();     int ans2=n-LIS1();     //printf("%d %d\n",n-ans1,n-ans2);     if(k>=ans1||k>=ans2)        printf("A is a magic array.\n");     else        printf("A is not a magic array.\n");    }    return 0;}



原创粉丝点击