IDEA
1.主要思想是将diamond的值累加,形成从小到大的有序序列,用二分法查找,满足>=m的最小序列
2.从1-n重复查找,找出最小的满足情况的序列(多个)
CODE
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
//二分法查找
void find(vector<int> &val,int m,int begin,int &end,int &tmp){
int left=begin,right=val.size()-1;
while(left<right){
int mid=(left+right)/2;
if(val[mid]-val[begin-1]>=m){
right=mid;
}else{
left=mid+1;
}
}
end=right;
tmp=val[end]-val[begin-1];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int n,m;//n是diamond数量,m是应付的钱
scanf("%d%d",&n,&m);
vector<int> val(n+1,0);
int sum=0;
for(int i=1;i<=n;i++){
int v;
scanf("%d",&v);
sum+=v;
val[i]=sum;
}
vector<pair<int,int> > res;
int best=-1;
for(int i=1;i<=n;i++){
int tmp,begin=i,end;
find(val,m,begin,end,tmp);
if(best==-1||best>tmp&&tmp>=m){
best=tmp;
res.clear();
res.push_back(make_pair(begin,end));
}else if(best!=-1&&tmp==best){
res.push_back(make_pair(begin,end));
}
}
for(int i=0;i<res.size();i++){
printf("%d-%d\n",res[i].first,res[i].second);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}