最长升序子序列
2015-08-13 11:02
288 查看
Description
Given a sequence a[1],a[2],a[3]......a
, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
Sample Input
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4
Case 2: 7 1 6
思路:
用二分法(避免超时)找最小的数放在子序列里面,比如最开始的序列是 2 3 4,但是后面又发现了一个1,就把1代替之前的2,以免后面出现更长的子序列
Given a sequence a[1],a[2],a[3]......a
, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.
Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).
Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.
Sample Input
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4
Case 2: 7 1 6
思路:
用二分法(避免超时)找最小的数放在子序列里面,比如最开始的序列是 2 3 4,但是后面又发现了一个1,就把1代替之前的2,以免后面出现更长的子序列
#include<iostream> #include<cstdio> using namespace std; #define maxn 100000+10 int al[maxn], cl[maxn]; int main() { int n,len,left,right,mid; while (scanf("%d",&n)!= EOF){ for (int i = 0; i < n; i++) scanf("%d", &al[i]); len = 0, cl[0] = -1; for (int i = 0; i < n; i++) { if (al[i]>cl[len]) cl[++len] = al[i]; //把大的数放进去 else { left = 1, right = len; //二分法找后面小的数放在这个子序列的前面,以免有更长的子序列 while (left <= right) { mid = (left + right) / 2; if (al[i]>cl[mid]) left = mid + 1; else right = mid - 1; } cl[left] = al[i]; } } printf("%d\n", len); } return 0; }
相关文章推荐
- SpringMVC表单标签(2)
- Zabbix监控之Linux命令行/Shell脚本解析json
- Git: Fix bad signature and index file corrupt error
- Git: Fix bad signature and index file corrupt error
- 怎么样实现左侧页面点击后右边页面显示内容
- 缺乏这四个技能,都不好好意思说自己是做产品的
- iOS iOS8注册通知
- 九度 Online Judge 算法 刷题 题目1050:完数
- POJ 2485 Highways(最小生成树prim算法)
- Java Web项目中连接Access数据库的配置方法
- iOS开发-Day16-OC复合&class关键字
- Monkey测试log分析二
- 学习shencha-touch
- 关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法
- innodb中master线程的调度的算法改进(mysql 5.6.26)
- android几种不同对话框的实现方式
- Leetcode Q100 : Same Tree
- linux屏幕编程:curses库的使用
- 韓国と北朝鮮―事態の激化を避けよ
- hdu5377 Root