1044 Shopping in Mars (25 分)
思路
lower_bound当查找不出值,会返回一个超出范围的下标
用scanf、printf避免超时
这种有累加属性的,就是自带sort的,读取数据就要累加,然后首位置0方便操作。
二分查找大于等于某个数的值,然后如果等于即输出,没有一个等于即以最小值再一次搜索。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int num,sum[100005];
sum[0]=0;
for(int i = 1;i<=n;i++)
{
scanf("%d",&sum[i]);
sum[i]+=sum[i-1];
}
int flag = 1;
int min_value = 1000000000;
for(int i =1;i<=n;i++)
{
int j = lower_bound(sum+i,sum+n+1,m+sum[i-1])-sum;
if(j<=n)
min_value = min(min_value,sum[j]-sum[i-1]);
//cout<<i<<" "<<j<<endl;
//cout<<i<<" "<<n+1<<endl;
if (sum[j]-sum[i-1] == m)
{
printf("%d-%d\n",i,j);
flag =0;
}
}
if(flag)
{
for(int i =1;i<=n;i++)
{
int j = lower_bound(sum+i,sum+n+1,min_value+sum[i-1])-sum;
if (sum[j]-sum[i-1] == min_value)
printf("%d-%d\n",i,j);
}
}
}