标签:
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
输入有多组数据,每组测试数据包括两行。
第一行为一个整数n(0<=n<=100000),当n=0时,输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000])。
对应每个测试案例,需要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。
3 -1 -3 -2 5 -8 3 2 0 5 8 6 -3 -2 7 -15 1 2 2 0
-1 0 0 10 1 4 8 0 3
一开始代码如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 int n; 8 int num[100002]; 9 10 int main(int argc, char const *argv[]) 11 { 12 //freopen("input.txt","r",stdin); 13 while(scanf("%d",&n) != EOF && n != 0) { 14 for(int i = 0; i < n; i++) { 15 scanf("%d",&num[i]); 16 } 17 int maxx = -1002, cnt = 0; 18 int s = 0, state = 0; 19 int st = 0, et = 0; 20 for(int i = 0; i < n; i++) { 21 if(state == 0) { 22 s = i; 23 state = 1; 24 } 25 cnt = cnt + num[i]; 26 if(cnt > maxx) { 27 maxx = cnt; 28 st = s; 29 et = i; 30 } 31 if(cnt < 0) { 32 cnt = 0; 33 state = 0; 34 } 35 } 36 printf("%d %d %d\n",maxx,st,et); 37 } 38 return 0; 39 }
中间判断有些复杂,参考了一下别人的,修改如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 int n; 8 int num[100002]; 9 10 int main(int argc, char const *argv[]) 11 { 12 //freopen("input.txt","r",stdin); 13 while(scanf("%d",&n) != EOF && n != 0) { 14 int maxx = -1002, cnt = 0; 15 int s = 0; 16 int st = 0, et = 0; 17 18 for(int i = 0; i < n; i++) { 19 scanf("%d",&num[i]); 20 21 if(cnt >= 0) { 22 cnt = cnt + num[i]; 23 } 24 else { 25 cnt = num[i]; 26 s = i; 27 } 28 if(cnt > maxx) { 29 maxx = cnt; 30 st = s; 31 et = i; 32 } 33 } 34 35 printf("%d %d %d\n",maxx,st,et); 36 } 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/jasonJie/p/5810256.html