hdu3415Max Sum of Max-K-sub-sequence(单调队列)
2016-05-18 14:58
393 查看
题意:
思路:
给定一个长n的环形序列a[1]...a 。就是a[1]与a 是相邻的。问在这个环上取连续且不超过k长度的子序列,求所有满足条件 的子序列的的和的最大值。
思路:
求一个前缀和,那么区间[i,j]的和酒可以表示为sum[j] - sum[i-1],ans = max(all(sum[j] - sum[i-1])) (1<=j-i<=k-1),对于j而言只需要求前面满足条件的最小的s[i-1],这就可以用单调队列来维护了。
#include <stdio.h> const int maxn = 1e5 + 10; const int oo = -2099900000; int q[maxn<<1]; int s[maxn<<1]; int nu[maxn<<1]; int n, k; int main(int argc, const char * argv[]) { int t; scanf("%d", &t); int i; int ans, first, second; int head, tail; while(t--) { scanf("%d %d", &n, &k); s[0] = 0; for (i = 1;i <= n;++i) { scanf("%d", &nu[i]); s[i] = s[i-1] + nu[i]; } for (i = n + 1;i <= n + k - 1;++i) s[i] = s[i - 1] + nu[i - n]; head = 0, tail = 0; ans = oo; for (i = 1;i <= n + k - 1;++i) { while(head < tail && s[i - 1] < s[q[tail - 1]]) tail--; while(head < tail && i - q[head] > k) head++; q[tail++] = i - 1; if (s[i] - s[q[head]] > ans) { ans = s[i] - s[q[head]]; first = q[head] + 1; second = i; } } if (second > n) second -= n; printf("%d %d %d\n", ans, first, second); } return 0; }
相关文章推荐
- Android Uiautomator UiDevice类
- mysql进阶(二十二)MySQL错误之Incorrect string value: '\xE7\x81\xAB\xE7\x8B\x90...中文字符输入错误
- mysql进阶(二十二)MySQL错误之Incorrect string value: '\xE7\x81\xAB\xE7\x8B\x90...中文字符输入错误
- UIAlertController
- gitlab mergeRequest如何提交
- Win10 Mobile Build 14342上手体验视频
- druid对数据库连接进行加密
- x264 FFmpeg Options Guide
- android 针对MIUI系统Dialog显示
- @PathVariable和@RequestParam的区别
- 获取选中的radio的value
- java的String和StringBuilder类的替换方法的运用。
- UITableViewController与UIViewController的区别
- iOS开发之基础视图—— UIToolbar
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- Django错误处理:DoesNotExist: User matching query does not exist.
- iOS开发之UICollectionView的headerView实现与TableView一样的漂浮效果
- ios开发基础视图 - UIPickerView
- java.sql.SQLException: Field 'id' doesn't have a default value
- CharSequence与String的区别