Greedy:Subsequence(POJ 3061)
2016-01-20 23:57
357 查看
和最短序列
题目大意:找出一个序列中比至少和S相等的最短子序列(连续的)
本来这道题可以二分法来做复杂度O(NlogN),也可以用一个类似于游标卡尺的方法O(N)来做
先来讲游标卡尺法:
因为子序列是连续的,所以我们只用维护这个序列的开头和结尾就行了,保证这个序列的和一定要大于S,如果从头到尾的和都没S大那就直接输出0就好,ans初始化为n+1
#include <iostream> #include <functional> #include <algorithm> using namespace std; static int nums[100001]; int main(void) { int tests_sum, S, num_sum, lb, rb, tmp_sum, ans; scanf("%d", &tests_sum); while (tests_sum--) { scanf("%d%d", &num_sum, &S); for (int i = 0; i < num_sum; i++) scanf("%d", &nums[i]); lb = 0; rb = 0; tmp_sum = 0; ans = num_sum + 1; while (1) { while (rb < num_sum && tmp_sum < S) tmp_sum += nums[rb++]; if (tmp_sum < S) break; ans = min(ans, rb - lb); tmp_sum -= nums[lb++]; } printf("%d\n", ans>num_sum ? 0 : ans); } return 0; }
二分做法:主要是对sum进行枚举,我们知道sum一定是按照下标递增的(数都是正数),那么我们只要二分枚举到一个sum[t]-sum[s](也就是序列的值)比S刚好大就好了(lower_bound的功能)
#include <iostream> #include <functional> #include <algorithm> using namespace std; static int nums[100001],nums_sum_set[100001]; int main(void) { int tests_sum, S, num_sum, rb, ans; scanf("%d", &tests_sum); while (tests_sum--) { scanf("%d%d", &num_sum, &S); for (int i = 0; i < num_sum; i++) scanf("%d", &nums[i]); for (int i = 0; i < num_sum; i++) nums_sum_set[i + 1] = nums_sum_set[i] + nums[i]; if (nums_sum_set[num_sum] < S) printf("0\n"); else { ans = num_sum + 1; for (int i = 0; nums_sum_set[i] + S <= nums_sum_set[num_sum]; i++) { rb = lower_bound(nums_sum_set + i, nums_sum_set + num_sum, nums_sum_set[i] + S) - nums_sum_set;//和越小,说明偏移量越小 ans = min(ans, rb - i); } printf("%d\n", ans); } } return 0; }
相关文章推荐
- UIPageControl和NSTimer的使用
- leetcode笔记:Range Sum Query - Immutable
- 第五天,uiscorllview的滚动和缩放,以及代理调用,定时器,对话框
- UVA 822 Queue and A
- G面经prepare: Maximum Subsequence in Another String's Order
- iOS UITableView(十四) 设置TbleviewController的滚动范围
- android tv-Building TV Games
- com.android.tools.build:gradle:2.0.0-alpha3 build errors
- Android BLE与终端通信(二)——Android Bluetooth基础科普以及搜索蓝牙设备显示列表
- Android BLE与终端通信(二)——Android Bluetooth基础搜索蓝牙设备显示列表
- Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptabl
- UITableView Group类型扁平化适配iOS6.0
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
- 简述UIViewControl之间的七种传值方式
- request \response 总结
- 【慕课笔记】第四章 流程控制语句 第10节 JAVA循环跳转语句之continue
- servlet 之request
- LeetCode 225 Implement Stack using Queues(用队列来实现栈)(*)
- mui中文在线手册及教程文档