思路
把鑽石數量累加起來,這樣數組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;
}