zoukankan      html  css  js  c++  java
  • 2017 ACM/ICPC Asia 南宁区 L The Heaviest Non-decreasing Subsequence Problem

    2017-09-24 20:15:22

    writer:pprp

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

    题意:给你一串数,给你一个处理方法,确定出这串数的权值,然后让你在这串数中找到最长非下降子序列,并算出对应的权值和

    这道题花费我时间最长了,我还是不是特别理解LIS找到的一些模板也不怎么会使用,各种错误,趁这次机会好好理解一下

    代码如下:

    //ac : L
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    #define N 1000000+1000
    
    using namespace std;
    
    int a[N];
    int dp[N];
    
    int binarySearch(int key,int l,int r)
    {
        while(l <= r)
        {
            int mid = (l + r)>>1;
    
            if(key>=dp[mid] && key<=dp[mid+1])
                return mid;
            else if(key>dp[mid])
                l = mid+1;
            else
                r = mid-1;
        }
        return 0;
    }
    
    int main()
    {
        int ll = 0;
        int tmp;
        while(cin >> tmp)
        {
            if(tmp < 0)
            {}
            else if(tmp >= 10000)
            {
                for(int i=0; i<5; i++)
                {
                    a[ll++] = tmp-10000;
                }
            }
            else
            {
                a[ll++] = tmp;
            }
        }
    
        dp[1]=a[0];  //初始化
        int len=1;
        for (int i=1; i<ll; i++)
        {
            if (a[i]>=dp[len]) dp[++len]=a[i];  //如果可以接在len后面就接上
            else  //否则就找一个最该替换的替换掉
            {
                int j=upper_bound(dp+1,dp+len+1,a[i])-dp;  //找到第一个大于它的d的下标
                dp[j]=a[i];
            }
        }
    
        cout<<len<<endl;
    
        return 0;
    }

     给我一个提示,可以简化题目,一开始想着弄成一个结构体,记录权值,但其实简化以后就直接用LIS就好了

  • 相关阅读:
    简易自制线程池(备忘)
    大数据量的删除过程查看
    收集书籍备忘
    6月12日C代码
    fseek()
    区分int *p[4]与int (*p)[4]
    常用的字符串处理函数 C语言
    6月11日
    C学习代码
    文件读取 C语言
  • 原文地址:https://www.cnblogs.com/pprp/p/7588421.html
Copyright © 2011-2022 走看看