思路
把钻石数量累加起来,这样数组sum[i]就是1到i的值,这样数组就变成了递增的,就可以使用二分查找,从1开始循环**sum[mid] - sum[i - 1]**就可以找到最小的i 到 j的值。最后把结果保存起来
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<cmath>
#include<cstring>
#include<map>
using namespace std;
vector<int> sum,result;
int n,m;
void fun(int i,int &j,int &tempsum){
int left = i,right = n;
while(left < right){
int mid = (left + right) / 2;
if(sum[mid] - sum[i - 1] >= m)//i- 1可以包含从1开始的情况
right = mid;
else
left = mid + 1;
}
j = right;
tempsum = sum[j] - sum[i - 1];
}
int main(){
scanf("%d%d",&n,&m);
sum.resize(n + 1);
for(int i = 1;i <= n;i++){
scanf("%d",&sum[i]);
sum[i] += sum[i - 1];
}
int minans = sum[n];
for(int i = 1;i <= n;i++){
int j,tempsum;
fun(i,j,tempsum);
if(tempsum > minans)continue;
if(tempsum >= m){
if(tempsum < minans){
result.clear();
minans = tempsum;
}
result.push_back(i);
result.push_back(j);
}
}
for(int i = 0;i < result.size();i += 2)
printf("%d-%d\n",result[i],result[i + 1]);
return 0;
}