UVa

来源:互联网 发布:加拿大地缘政治知乎 编辑:程序博客网 时间:2024/06/05 20:53

题意

求连续乘积最大值

思路

连续子序列有两个要素:起点和终点,因此只需枚举起点和终点即可。由于每个元素的绝对值不超过10且不超过18个元素,最大可能的乘积不会超过1018,可以用long long存储

对负数的特殊处理 :
如果遇到乘完某负数后结果变为负数,则应该搜索该遍历区间后面的数还有几个负数,如果没有剩余的负数了( mm == 0 ),之后的乘积一定是负数,也就没有必要继续往后遍历的必要了

AC代码

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#define maxn 1000 + 10int s[maxn];int main(){    int n, num = 0;    while( ~scanf("%d",&n) )    {        for( int i = 0 ; i < n ; i++ )            scanf("%d",&s[i]);        long long a, cheng = s[0];        for( int i = 0 ; i < n ; i++ )        {            int dx = 1;            a = s[i];            cheng = a > cheng ? a : cheng;            int mm = 0; //记录尚未遍历的数中还有多少负数            for( int j = i+1 ; j < j + dx && j < n ; j++ )            {                a *= s[j];                if( a < 0 && s[j] < 0 )                {                    for( int k = j ; k < j + dx && k < n; k++ )                        mm++;                    if( mm == 0 ){                        cheng = a/s[j];                        break;                    }                }                cheng = a > cheng ? a : cheng;                dx++;            }        }        cheng = cheng < 0 ? 0 : cheng;        printf("Case #%d: The maximum product is %lld.\n\n",++num, cheng);    }    return 0;}
原创粉丝点击