UVA 11059(水题)

本文介绍了一种解决最大连续子序列正积问题的方法。给定一个包含最多18个元素的序列,每个元素范围为-10到10,通过两重循环枚举所有连续子序列,并使用longlong类型来避免整数溢出,最终找出最大正积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这里写图片描述
【题目大意】
给定一个序列S,最多18个元素,每个元素的范围都是-10到10,对于这个序列S的所有连续子序列,求这些连续子序列中最大的正积。如果最大的积是负数,答案视为0。
【解法】
两重循环,枚举S所有的子序列
【坑点】
如果是18个10相乘得到10^18,会超出int的范围,所以要用long long类型
【AC代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

int main(){
    int N;
    long long s[25];
    long long ans;
    int cas = 1;
    while(scanf("%d", &N) != EOF){
        for(int i = 0 ; i < N; i++){
            scanf("%lld", &s[i]);
        }
        ans = s[0];
        long long  term;
        for(int i = 0; i < N; i++){
            term = s[i];
//            printf("term = %lld\n", term);
            ans = max(ans, term);
            for(int j = i + 1; j < N; j++){
                term *= s[j];
//                printf("term = %lld\n", term);
                ans = max(ans, term);
            }
        }

        if(ans > 0){
            printf("Case #%d: The maximum product is %lld.\n\n", cas, ans);
        }
        else{
            printf("Case #%d: The maximum product is 0.\n\n", cas);
        }
        cas++;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值