http://poj.org/problem?id=3061

题目大意:

给定长度为n的整列整数a[0],a[1],……a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值。

思路:

方法一:

首先求出各项的和sum[i],这样可以在O(1)的时间内算出区间上的总和,这样,枚举每一个起点i,然后二分搜索出结果大于sum[i]+tot的最小下标。(tot是题目中的S)

总的时间为O(nlogn)

方法二:

设以a[s]开始的总和最初大于S时的连续子序列为a[s]+a[s+1]+……a[t-1],这时,a[s+1]+a[s+1]+……a[t-2]<a[s]+a[s+1]+……a[t-2]<S,所以如果从a[s+1]开始总和最初超过S的连续子序列是a[s+1]+……a[t‘-1],则t<=t'。

故可以设计如下算法:

1.初始s=t=sum=0

2.只要依然有sum<S,就不断将sum加上a[t],并且t=t+1;

3.如果2中无法满足sum>=s则终止,否则ans=min(ans,t-s);

4.将sum减去a[s],s+=1后回到2

总复杂度为O(N)

1.二分法

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100000+10;
const int INF=0x7fffffff;
int a[MAXN],sum[MAXN];
int search(int L,int R,int target) //(L,R]
{
while(L<R-1)
{
int m=(L+R)>>1;
if(sum[m]<target)
L=m;
else
R=m;
}
return R;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,tot;
scanf("%d%d",&n,&tot);
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
int ans=INF;
for(int i=1;i<=n&&sum[i]+tot<=sum[n];i++)
{
int t=search(i,n,tot+sum[i]);//sum[t]-sum[i]>=tot -> sum[t]>=tot+sum[i]
ans=min(ans,t-i);
}
if(ans==INF)
printf("0\n");
else
printf("%d\n",ans);
}
return 0;
}

2.尺取法

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100000+10;
const int INF=0x7fffffff;
int a[MAXN]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,tot;
scanf("%d%d",&n,&tot);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int s=0,t=0,sum=0,ans=INF;
while(true)
{
while(sum<tot && t<n)
{
sum+=a[t++];
}
if(sum<tot) break;
ans=min(ans,t-s);
sum-=a[s++];
}
if(ans==INF)
printf("0\n");
else
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. vi编辑器命令
  2. CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎
  3. asl 和 lgpl的区别
  4. Linux环境的PHP执行
  5. 在beforeAction里redirect无效,Yii2.0.8
  6. hiho1093_spfa
  7. 【转】资源文件在Delphi编程中的应用
  8. C# System.Uri类_获取Url的各种属性_文件名_参数_域名_端口等等
  9. Spring整合Quartz
  10. POJ 3368 RMQ-ST
  11. HDU 4081 Qin Shi Huang&#39;s National Road System 次小生成树变种
  12. SQL Server中关于基数估计如何计算预估行数的一些探讨
  13. python之路之简单介绍:
  14. $.ajax ,ajax请求添加请求头,添加Authorization字段
  15. back
  16. Python3学习之路~5.3 random模块
  17. office完全卸载
  18. 剑指offer-面试题1:赋值运算符函数
  19. (转)Docker镜像中的base镜像理解
  20. 修改mysql权限

热门文章

  1. css————获取样式的各种方法
  2. Python入门:全站url爬取
  3. SQL Server 函数的使用 Function
  4. 游戏开发之UDK引擎介绍和模型导入
  5. Kinect 开发 —— Kinect for windows SDK
  6. linux中内存泄漏的检測(五)记录内存泄漏的代码
  7. C++的class的样例
  8. virmon防火墙64位正式版(暂定)公布
  9. 自定义控件学习——下拉刷新ListView
  10. 26.event跨进程通信