2017南宁网络赛L.The Heaviest Non-decreasing Subsequence Problem (最长非递减子序列)

来源:互联网 发布:e订通软件 编辑:程序博客网 时间:2024/05/19 01:29

题意:

给你一个序列。对于每个元素,如果他的值小于0,那么他的权重为0;如果他的值大于等于10000,那么他的真实值减去10000,且他的权重为5;否则他的权重为1。

求一个元素值非递减的序列,使得权重值最大。

思路:

根据要求重新构建一个序列,小于0则不加入,大于等于0且小于10000加入1次,大于10000加入5次。然后用nlogn的方法求最长上升子序列即可。

代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+7;int arr[maxn];int dp[maxn];int main(){    int num,l = 0;    while(~scanf("%d",&num))    {        if(num>=10000)        {            num-=10000;            for(int i = 0;i<5;i++)            {                arr[l++] = num;            }        }        else if(num>=0)        {            arr[l++] = num;        }    }    int len = 0;    dp[len] = 0;    dp[++len] = arr[0];    for(int i = 1;i<l;i++)    {        if(arr[i]>=dp[len])            dp[++len] = arr[i];        else        {            int pos = upper_bound(dp,dp+len+1,arr[i])-dp;            dp[pos] = arr[i];        }    }    printf("%d",len);    return 0;}

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