直接暴力弄会有两个case超时。
需要优化一下。
参考这个大神的思路的 http://blog.csdn.net/tiantangrenjian/article/details/19251273
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
struct node {
int i;
int j;
int sum;
};
vector <node> leq;
vector <node> lov;
int N, M;
vector <int> link;
vector <int> n2o;
int main() {
cin >> N >> M;
int temp;
node tempN;
for (int i = 0; i < N; i++) {
scanf("%d", &temp);
link.push_back(temp);
}
int sum = 0;
n2o.push_back(sum);
for (int i = 0; i < N; i++) {
sum += link[i];
n2o.push_back(sum);
}
int min = INT_MAX;
for (int i = 0; i < N; i++) {
int left = i;
int right = N;
while (left < right) {
int mid = (right + left) / 2;
if (n2o[mid] - n2o[i] >= M) {
right = mid;
}
else
left = mid + 1;
}
tempN.j = right;
tempN.i = i;
tempN.sum = n2o[tempN.j] - n2o[tempN.i];
tempN.i++;
if (tempN.sum == M) {
leq.push_back(tempN);
}
else if(tempN.sum > M) {
if (tempN.sum < min) {
lov.clear();
lov.push_back(tempN);
min = tempN.sum;
}
else if(tempN.sum == min){
lov.push_back(tempN);
}
}
}
if (leq.size() != 0) {
for (int i = 0; i < leq.size(); i++) {
printf("%d-%d\n", leq[i].i , leq[i].j );
}
}
else {
for (int i = 0; i < lov.size(); i++) {
printf("%d-%d\n", lov[i].i , lov[i].j );
}
}
system("pause");
return 0;
}