/*
注意题目描述:接下去一行为n个整数,描述这个数组,整数绝对值不大于100。
判断如果k比连续子数组和的最大值还大,比最小值还小,那么肯定无解了,直接输出No
*/
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn = 10005;
int a[maxn];
int b[maxn];
int main(){
int n;
while(~scanf("%d",&n)){
int sum = 0;
int max = -100;
int min = 100;
int tmax = 0;
int tmin = 0;
for(int i = 1; i <= n; i++){
scanf("%d", a+i);
sum += a[i];
b[i] = sum;
if(tmax < 0)//动态规划的思想,挑出最大的连续区间和
tmax = a[i];
else
tmax += a[i];
max = max > tmax ? max : tmax;
if(tmin > 0)
tmin = a[i];
else
tmin += a[i];
min = min < tmin ? min : tmin;
}
printf("%d %d\n",tmax,tmin);
printf("%d %d\n",max, min);
int k;
scanf("%d",&k);
if(k < min || k > max){
printf("No\n");
continue;
}
//for(int i = 0;i < n;i++)
// printf("%d %d\n",a[i],b[i]);
int flag = 0;
for(int i = 0;i <= n-1;i++){
for(int j = i+1;j <= n;j++)
if(b[j] - b[i] == k){
printf("%d %d\n",i+1,j);
flag = 1;
break;
}
if(flag)
break;
}
if(!flag)
printf("No\n");
}
return 0;
}
还可以利用前缀和做一个映射sum[i] -->i ,利用map。
参照了学长的代码:http://blog.csdn.net/u013491262/article/details/21406351
#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <map>
using namespace std;
const int maxn = 10005;
map<int, vector<int> >mp;
int array[maxn];
int sum[maxn];
int n,k;
void solve(){
int s,e;
vector<int>v;
vector<int>::iterator it;
for(s = 1;s <= n;s++){
e = sum[s-1] + k;
if(mp.find(e) == mp.end())
continue;
v = mp[e];
for(it = v.begin(); it < v.end();it++){
if((*it) >= s){
printf("%d %d\n",s,(*it));
return;
}
}
}
puts("No");
}
int main(){
while(~scanf("%d",&n)){
mp.clear();
for(int i = 1;i <= n;i++){
scanf("%d",&array[i]);
sum[i] = sum[i-1] + array[i];
mp[sum[i]].push_back(i);
}
scanf("%d",&k);
solve();
}
return 0;
}