最大乘积
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/B
题意:
输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0.
注意格式。
Sample Input
3
2 4 -3
5
2 5 -1 2 -1
Sample Output
Case #1: The maximum product is 8.
Case #2: The maximum product is 20.
分析:
设置x为最大值y为最小值 ,在枚举更新时,如果a[i]为正,则对应跟新,
a[i]为0时,当前最大值,最小值置零,a[i]小于0时,最大的值乘以a[i]后变成最小,
相反最小变成最大。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int i,n,a[20],count=1; 6 while(cin>>n) 7 { 8 long long max=0,x=0,y=0,z; //乘积最大可以为10^18所以防止溢出用long long 9 for(i=0;i<n;i++) 10 cin>>a[i]; 11 for(i=0;i<n;i++) 12 { 13 if(a[i]==0) x=y=0; 14 else if(a[i]>0) 15 { x=x*a[i]; 16 y=y*a[i]; 17 if(x==0) x=a[i]; 18 }else if(a[i]<0) //小于0进行交叉相乘 19 { 20 z=x*a[i]; 21 x=y*a[i]; 22 y=z; 23 if(y==0) y=a[i]; 24 } 25 if(max<x&&a[i]) 26 max=x; 27 } 28 printf("Case #%d: The maximum product is %lld. ",count++,max); 29 } 30 return 0; 31 }