注:推荐用二分法;这里用的是普通优化方法。
注2 :第二个测试用例不过是因为MAX 取小了。
#include <stdio.h>
#include <deque>
#define MAX 999999999
using namespace std ;
typedef struct Pair {
int first;
int second;
} Pair;
int main(int argc, char *argv[]) {
int n, m;
scanf ("%d %d" , &n, &m);
int i, j, k;
int *a = new int [n + 1 ];
int (*b)[2 ] = new int [n + 1 ][2 ];
for (i = 1 ; i <= n; i++) {
scanf ("%d" , &a[i]);
b[i][0 ] = b[i][1 ] = MAX;
}
int sum = 0 ;
int presum = 0 ;
int preindex = 1 ;
for (j = 1 ; j <= n; j++) {
sum += a[j];
if (sum >= m) {
b[1 ][0 ] = preindex = j;
b[1 ][1 ] = presum = sum;
break ;
}
}
for (i = 2 ; i <= n; i++) {
sum = presum - a[i - 1 ] - a[preindex];
for (j = preindex; j <= n; j++) {
sum = sum + a[j];
if (sum >= m) {
b[i][0 ] = preindex = j;
b[i][1 ] = presum = sum;
break ;
}
}
if (sum < m) break ;
}
int min = MAX;
deque <Pair> dq;
for (i = 1 ; i <= n; i++) {
if (b[i][1 ] < min) {
min = b[i][1 ];
dq.clear();
Pair p;
p.first = i;
p.second = b[i][0 ];
dq.push_back(p);
} else if (b[i][1 ] == min) {
Pair p;
p.first = i;
p.second = b[i][0 ];
dq.push_back(p);
}
}
for (i = 0 ; i < int (dq.size()); i++) {
printf ("%d-%d\n" , dq[i].first, dq[i].second);
}
return 0 ;
}