算法初步——尺取法精选.pptx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法初步——尺取法精选

尺取法——算法初步描述 尺取法通常是指对数组保存保存一对下标(起点,终点),然后根据实际情况交替推进两个端点直到得出答案的方法。例题给定长度为n(10 N 100 000)的数列整数a0,a1,…,an-1以及整数S(S 100 000 000)。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。样例:n=10S=15a={5,1,3,5,10,7,4,9,2,8}56091424313544465451351074928①求出sum(i)=a0+a1+…+ai-1O(n)方法一:二分法②二分搜索满足条件的最小值O(nlogn)int n,S;int a[MAX_N];int sum[MAX_N+1];void solve(){ //计算sum for(int i=0;in;i++){ sum[i+1]=sum[i]+a[i]; } if(sum[n]S){ //解不存在 printf(0\n); return ; } int res=n; for(int s=0;sum[s]+S=sum[n];s++){ //利用二分搜索求出t int t=lower_bound(sum+s,sum+n,sum[s]+S)-sum; res=min(res,t-s); } printf(%d\n,res);}给定长度为n(10 N 100 000)的数列整数a0,a1,…,an-1以及整数S(S 100 000 000)。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。样例:n=10S=15a={5,1,3,5,10,7,4,9,2,8}51351074928方法二:尺取法int n,S;int a[MAX_N];int sum[MAX_N+1];void solve(){ int res=n+1; int s=0,t=0,sum=0; for(;;){ while(tnsumS){ sum+=a[t++]; } if(sumS) break; res=min(res,t-s); sum-=a[s++]; } if(resn){ //解不存在 res=0; } printf(%d\n,res);}O(n)POJ?2566 /vjudge/problem/viewProblem.action?id=39361Bound Found POJ?3320 /vjudge/problem/viewProblem.action?id=24699Jessicas Reading /vjudge/problem/viewProblem.action?id=24699Problem/vjudge/problem/viewProblem.action?id=24699 HDU?1058 /vjudge/problem/viewProblem.action?id=17350Humble Numbers Thank you!

文档评论(0)

pfenejiarz + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档