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就好了