The Heaviest Non-decreasing Subsequence Problem LIS 思维题

来源:互联网 发布:协方差矩阵的特征值 编辑:程序博客网 时间:2024/06/05 03:56

又是一场思路僵化带来的GG

给出一个宽度的定义, 小于0的数宽度为0,大于10000的数宽度为5,否则宽度为1;

给定一个序列, 大于10000的数在减去10000之后再在序列中比较,   找出宽度之和最大的非递减子序列。

开始很懵,由于数据范围是200000,就想跑个nlogn的LIS。 但是又需要比较出往这个子序列中添加的数要满足宽度之和最大的大条件。

所以还是写了个n方的。但是莫名其妙的各种错误。。。。

结束后听他们说,把宽度为5的,变成5个重复的数放进去就好。


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <map>#include <vector>using namespace std;const int N = 400000;int b[N];int a[N];int bsea(int num, int low, int high){    while(low<=high)    {        int mid = (low + high)/2;        if(num>=b[mid])            low = mid+1;        else high= mid-1;    }    return low;}int DP(int n){    int len  = 1;    b[1] = a[1];    for(int i=2;i<=n;i++)    {        if(a[i]>=b[len])        {            b[++len] = a[i];        }        else        {            int pos = bsea(a[i],1,len);            b[pos] = a[i];        }    }    return len;}int main(){    int o = 0;    int t;    while(scanf("%d",&t)!=EOF)    {        if(t<0) continue;        if(t>10000)        {            t -= 10000;            for(int i=1; i<=5; i++)            {                a[++o] = t;            }        }        else        {            a[++o] = t;        }    }    int l = DP(o);    cout<<l<<endl;    return 0;}


阅读全文
0 0
原创粉丝点击