#include<cstdio>
int n,m;
//sum[i]表示前i个元素之和
int sum[100010]={0};
//maxnum表示最小支付金额(有可能大于m)
int maxnum=100000010;
//折半查找
int binary(int l,int r,int x)
{
int low=l,high=r,mid;
while(low<high)
{
mid=(low+high)/2;
if(sum[mid]>x)
high=mid;
else
low=mid+1;
}
return low;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&sum[i]);
sum[i]+=sum[i-1];
}
//找出最小支付金额
for(int i=1;i<=n;i++)
{
int j=binary(i,n+1,sum[i-1]+m);
if(sum[j-1]-sum[i-1]==m)
{
//能刚好支付m
maxnum=m;
break;
}
//不能刚好支付m
else if(j<=n&&sum[j]-sum[i-1]<maxnum)
maxnum=sum[j]-sum[i-1];
}
for(int i=1;i<=n;i++)
{
int j=binary(i,n+1,sum[i-1]+maxnum);
if(sum[j-1]-sum[i-1]==maxnum)
printf("%d-%d\n",i,j-1);
}
return 0;
}
PAT 1044 Shopping in Mars (25 分)
最新推荐文章于 2022-09-23 16:02:06 发布