2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L.The Heaviest Non-decreasing Subsequence Problem

来源:互联网 发布:网络最火说唱歌手排名 编辑:程序博客网 时间:2024/05/26 02:18

题目链接:https://nanti.jisuanke.com/t/17319

题目大意:求构成的非递减序列的最大权值

解题思路:trick就是把价值为5的数分成5个价值为1的数,这并不会影响决策,对于负数,直接忽略,因为对结果不产生任何影响,所以直接用LIS

AC代码:

#include<cstdio>using namespace std;const int MAXN = 2 * 1000000 + 5;int gt[MAXN], dp[MAXN];int binarySearch(int l, int r, int val){    int mid;    while (l <= r)    {        mid = (l + r) >> 1;        if (dp[mid] <= val) l = mid + 1;        else r = mid - 1;    }    return l;}int toLis(int n){    int tot = 0;    dp[tot++] = gt[0];    for (int i = 1;i < n;i++)    {        if (gt[i] >= dp[tot - 1])            dp[tot++] = gt[i];        else        {            int pos = binarySearch(0, tot - 1, gt[i]);            dp[pos] = gt[i];        }    }    return tot;}int main(){    int pos = 0;    for (int tmp;scanf("%d", &tmp) == 1;)    {        if (tmp >= 10000)            for (int i = 1;i <= 5;i++)                gt[pos++] = tmp - 10000;        else if (tmp < 0) continue;        else gt[pos++] = tmp;    }    printf("%d\n", toLis(pos));    return 0;}
阅读全文
0 0
原创粉丝点击