最长上升子序列
来源:互联网 发布:淘宝待揽件是什么意思 编辑:程序博客网 时间:2024/06/12 21:52
问题 I(2486): 最长上升子序列
时间限制: 1 Sec 内存限制: 128 MB题目描述
给出一个长度为N的整数序列,求出包含它的第K个元素的最长上升子序列。
输入
第一行两个整数N, K
第二行N个整数
输出
如题目所说的序列长度。
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
8 665 158 170 299 300 155 207 389
样例输出
4
提示
【数据范围】
0 < N ≤ 200000,0 < K ≤ N
上代码
#include<cstdio>#include<climits>int n,min,k,a[200005],f[200005]={INT_MIN};//用f[i]来表示长度为i的序列末尾最小值int main(){ scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { if((i<k&&a[i]>=a[k])||(i>k&&a[i]<=a[k]))/*如果a[i]在a[k]的前面,就是i<k时并且比a[k]大或者是在a[k]的后面,就是i>k时并且比a[k]小就可以删除啦*/ continue; if(a[i]>f[min]) { f[++min]=a[i];//当它大于边界值时,就赋值给之后的数 continue; } int l=0,r=min,t=0; while(l<=r) { int mid=(l+r)/2; if(a[i]>f[mid]) l=mid+1,t=mid; else r=mid-1; } if(f[t+1]>a[i]) f[t+1]=a[i];//使f[i]的值变成此轮循环的最小值 } printf("%d\n",min);}
阅读全文
0 0
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 脚本和物理系统的结合使用
- JS实现进度条
- 内核同步原语
- zzuli 2182 不是签到题XD【数论定理】
- 浅析Linux命令之head和tail
- 最长上升子序列
- 实现strcpy得分点
- SpringBoot项目技术点一
- 暑假训练总结
- 手动构造固定平台下语义编译器(LL(1)文法)
- iOS学习笔记-091.彩票06——我的彩票
- 如何在springcloud分布式系统中实现分布式锁
- 数据分析&机器学习&人工智能,从零开始起步
- linux用shell脚本模拟时钟 && 脚本录制