集训第四周(高效算法设计)N题 (二分查找优化题)
2015-08-05 19:14
411 查看
原题:poj3061
题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s
这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了。比如数组长度为10,你先找5,去枚举每一个区间为5的连续的数,发现存在这样的数,那么就可以继续往左找,反之则往右找,直到左右区间重合,即为正确答案,(有可能是右区间小于左区间,所以每次都应该求区间中点值)
题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s
这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了。比如数组长度为10,你先找5,去枚举每一个区间为5的连续的数,发现存在这样的数,那么就可以继续往左找,反之则往右找,直到左右区间重合,即为正确答案,(有可能是右区间小于左区间,所以每次都应该求区间中点值)
#include"iostream" #include"set" #include"cstring" #include"cstdio" #include"algorithm" using namespace std; const int maxn=100000+10; int a[maxn]; long long sum[maxn]; int n,s; bool guess(int c) { int temp; for(int i=0;i<=n-c;i++) { temp=sum[c+i]-sum[i]; if(temp>=s) return true; } return false; } int main() { while(cin>>n>>s) { sum[0]=0; for(int i=0;i<n;i++) { cin>>a[i]; sum[i+1]=a[i]+sum[i]; } if(sum[n]<s) cout<<0<<endl; else { int l=0,r=n-1,m,ans=10000; while(l<r) { m=(r+l)/2; if(guess(m)) {r=m;} else l=m+1; } m=(r+l)/2; cout<<m<<endl; } } return 0; }
相关文章推荐
- VI use
- 【spring配置】 一组配置文件引出的问题
- c#运行机制
- [JLOI2014][BZOJ3631] 松鼠的新家|树上倍增LCA|差分
- Eclipse安装Svn插件
- 黑马程序员---C语言基础---条件、循环语句、函数
- 第二周第三天
- 【大拿分享】单页应用的搜索引擎优化
- 4.7 带自信区间的曲线图
- python argparse
- 大数模小数
- iOS开发之----去除tableViewCell分割线的左边间隙,将分割线填满
- org.springframework.web.servlet.view.InternalResourceViewResolver
- 超级减肥王 V4.1.0 iPad版
- smarty中定义数据变量问题
- Android侧滑菜单实现
- 应用程序窗口示例
- 快巴汽车票 v1.3.2 安卓版
- sql server对应C#类型
- [转]手工释放linux内存——/proc/sys/vm/drop_caches