这题……通过率只有0.3,我觉得很诧异……思路不难啊……
然鹅陈越考的是时间和空间限制……
告辞……
第一种尝试:使用二维数组,超限,只有19分……及格万岁
第二种:动态指针……超限(哔—)
Ok,Fine!!!抬头看大路朝天……
答案清一色二分查找……不过我关心的事如何使数组不超限……
一位大大用了
const int Max = 100010;
int sum[Max] = { 0 };
WTF!!!为什么这样不超限????
另一位用了vector……后面加上了resize,所以没有超限……
vec_sum.resize(N + 1);//控场!
所以我们看这位大大的答案
#include <cstdio>
#include <algorithm>
using namespace std;
const int Max = 100010;
int sum[Max] = {0}, total, M;
int upper(int l, int r, int x){
while(l < r){
int mid = (l+r)/2;
if(sum[mid] < x)
l = mid+1;
else
r = mid;
}
return l;
}
int main()
{
int nears = 1000000000;
scanf("%d%d", &total, &M);
for(int i = 1; i <= total; i++ ){
scanf("%d", &sum[i]);
sum[i] += sum[i-1];
}
for(int i = 1; i <= total; i++){
int j = upper(i, total+1, sum[i-1] + M) ;
if(sum[j-1] - sum[i-1] == M){
nears = M;
break;
}
else if(j <= total && sum[j-1] - sum[i-1] < M){
nears = min(nears, sum[j]- sum[i-1]);
}
}
for(int i = 1; i <= total; i++){
int j = upper(i, total+1, sum[i-1]+nears);
if(sum[j] - sum[i-1] == nears){
printf("%d-%d\n", i, j);
}
}
return 0;
}
and 也要把二分查找背会……