poj 3061 Subsequence
2014-03-20 19:43
495 查看
最近一直在看watashi大神翻译的《挑战程序设计竞赛》,书写的很不错呢,自己还需要更多的努力!
这道题目就源自那本书的一个例题,称之为 “取尺法”
先说下题目的大意:给定长度为n的的整数数列a0,a1,a2,.....a(n-1),求出总和不小于S的连续子序列长度的最小值。
由于序列是连续的,那么只要从序列的开始往后找某一段区间满足这个条件即可
只要有sum < S ,那么就继续将序列的下一个元素加到sum中。
若sum > S,从子序列的前面剔除出一个元素,看是否还满足 sum > S。
这样不断的把最小的子序列的长度给记录下来。
这道题目就源自那本书的一个例题,称之为 “取尺法”
先说下题目的大意:给定长度为n的的整数数列a0,a1,a2,.....a(n-1),求出总和不小于S的连续子序列长度的最小值。
由于序列是连续的,那么只要从序列的开始往后找某一段区间满足这个条件即可
只要有sum < S ,那么就继续将序列的下一个元素加到sum中。
若sum > S,从子序列的前面剔除出一个元素,看是否还满足 sum > S。
这样不断的把最小的子序列的长度给记录下来。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int vMax = 100010; const int INF = 0x3f3f3f3f; int a[vMax]; int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int ncase; int N,S; scanf("%d",&ncase); while(ncase--) { memset(a,0,sizeof(a)); scanf("%d %d",&N,&S); for(int i = 1 ; i <= N ; i++) { scanf("%d",&a[i]); } int sum = 0 ; int res = INF; int sta = 0; int fin = 1; while(1) { while(sum < S && fin <= N) { sum += a[fin++];//不断将ai加入到sum中,知道满足条或者是不能再加了 } if(sum < S)//没有意义的 { break; } res = min(res,fin - sta); sum -= a[sta++];// 满足 sum > S 后从子序列的前面剔除出一个元素,若还满足sum > S 则len就减少了 } if(res > N)//满足条件的子序列不可能比原序列还要长 { res = 0; } cout<<res<<endl; } return 0; }
相关文章推荐
- Sequence Adjustment
- GUI测试要点
- ligerUI分页bug
- 9.8 VS qt的ui变量的调用
- QUIC简介
- CCMenu及CCMenuItem位置问题
- UITabBarController
- POJ 2299 Ultra-QuickSort(树状数组+离散化处理)
- 虚幻引擎4(Unreal Engine 4/UE4)正式发布!每月19美元
- mysql中key 、primary key 、unique key 与index区别
- UISearchDisplayController 阴影遮盖frame调整
- UICollectionView 的使用
- iOS 上的蓝牙框架 - Core Bluetooth for iOS
- [屌丝PM]我经历的NUI变革期
- 解决easyui中datebox的格式化问题
- UIPickerView常用方法详解
- IOS&nbsp;UITableView&nbsp;NSInde…
- UITableView的常用代理方法
- (转)iOS&nbsp;UIControl&nbsp;几个事件的说明
- PROPAGATION_REQUIRED