LA 2678 Subsequence(二分查找)
2014-09-06 16:42
246 查看
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=679
解题报告:给定一个正整数的序列,和一个S,求长度最短的子序列,使它们的和大于或等于S。序列长度n <= 100000
很明显,如果枚举起点和终点的话,时间复杂度是O(n^3),不行。怎么能在O(1)时间求出一个子序列的和是多少呢,可以用另一个数组sum[i],意义是第一个到
第i个数的和是sum[i],这样的话就可以做到在O(1)时间求出一个子序列的和,但这样还是不够,我的做法是只枚举子序列的终点,然后找到一个j使得sum[j] >= sum[i] - S,那么这个子序列的长度就是i - j + 1,因为sum[i]是递增的,在查找j的位置的时候用二分查找,所以,这样就把时间复杂度降到了n*log2(n),就可以过了。
View Code
解题报告:给定一个正整数的序列,和一个S,求长度最短的子序列,使它们的和大于或等于S。序列长度n <= 100000
很明显,如果枚举起点和终点的话,时间复杂度是O(n^3),不行。怎么能在O(1)时间求出一个子序列的和是多少呢,可以用另一个数组sum[i],意义是第一个到
第i个数的和是sum[i],这样的话就可以做到在O(1)时间求出一个子序列的和,但这样还是不够,我的做法是只枚举子序列的终点,然后找到一个j使得sum[j] >= sum[i] - S,那么这个子序列的长度就是i - j + 1,因为sum[i]是递增的,在查找j的位置的时候用二分查找,所以,这样就把时间复杂度降到了n*log2(n),就可以过了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 100005; int A[maxn],sum[maxn]; int find(int *B,int l,int r,int d) { while(l < r) { int mid = (l + r) >> 1; if(d <= B[mid]) r = mid; else l = mid + 1; } return l; } int main() { int n,s; while(scanf("%d%d",&n,&s)!=EOF) { int k = 0; sum[0] = 0; for(int i = 1;i <= n;++i) { scanf("%d",&A[i]); sum[i] = sum[i-1] + A[i]; if(k == 0 && sum[i] >= s) k = i; } int ans = 0x7fffffff; for(int i = k;i <= n;++i) { int t = find(sum,1,i,sum[i] - s); if(sum[t] > sum[i]-s) t--; ans = min(ans,i - t); } printf(ans > 100000? "0\n":"%d\n",ans); } return 0; }
View Code
相关文章推荐
- 二分,枚举+查找(子序列,LA 2678)
- LA_2678 - Subsequence( 二分 )
- LA 2678 Subsequence
- LA 2678 Subsequence
- UVaLive 2678(LA)Subsequence SEERC 2006 题解
- LA 2678 – Subsequence
- LA 2678 Subsequence
- POJ 3061 Subsequence (二分查找)
- LA 2678 – Subsequence
- LA2678 Subsequence 时间优化
- LA 2678 Subsequence(尺取法)
- LA 2678(p48)----Subsequence
- UVALive2678 UVA1121 Subsequence【前缀和+二分搜索+尺取法】
- LA 2678 - Subsequence
- Subsequence--二分查找
- LA 2678 Subsequence
- LA 2678 Subsequence
- LA 2678 UVA 1121 - Subsequence
- 【二分查找+优化O(n)】【续UVA1121】Subsequence
- POJ 2533 Longest Ordered Subsequence 二分查找(LIS nlogn算法)