最近的一篇题目

Posted on 2018-10-02 22:09  亦辰落  阅读(144)  评论(0编辑  收藏  举报

UVa11059Maximum Product

题意

给一串整数S,你需要找到其连续子序列中乘积最大的那个,输出其乘积。如果找到的答案不是正数,那么输出0,表示无解。

另外注意:每组输入后面都有一行空格,每组输出后面也应该有一行空格。输入以EOF结束。

然后,按照UVa中的数据范围,它不是很大,差不多就是: 1<=n<=18,-10<=s[i]<=10;

本人思路:

因为是最大乘积+连续子序列,所以这就是一个连乘题目 当然首先的一个思路就是暴力如下:

那么在这么小的数据范围内,一个longlong即可,因为数内有负数,所以我们可以先搜索一遍是否拥有负数,若没有,就把整个S数组乘起来,或者负数的个数共有偶数个也可以乘起来

such as this:ans*=s[i]

若有负数且不为偶数个,那么就暴力搜索子序列中乘积最大的值,然后输出正解即可,这里的这个你可以认为是前缀和变成前缀乘

(那啥,这个代码我没写我用的是另一种思路,上面这个比较好理解)

另一种思路:

直接暴力(本人走暴力流
连续子序列的两种要素:起点和终点。

这里和上面的第二部有些类似,需要枚举起点和终点的位置即所有连续子序列。对于其中元素来说,只需要枚举出全部连续子序列然后计算乘积比较就行。

对于其中的乘积不会超过10^18,所以爆搜加一个longlong就可以解决问题

释放代码(蠢蠢欲动的代码

#include<iostream>
#include<cstdio>
#include<algorithm> 

using namespace std;

long long s[105];//数组,来存的 

int main(){
    int n;
    int cnt=0;//这个是用来计算第几个解的 
    while(cin>>n){    
        long long ans=0;
        for (int i=0;i<n;++i)
            cin>>s[i];
        for (int i=1;i<=n;++i){
            for (int j=0;j+i<=n;++j){
            //这里的j是子序列的起点,从0开始找 
                long long jishu=1;//这个计数器是用来比较连续子序列乘积与ans原数的大小 
                //相当于计算器里的 M+ (笑) 
                for (int k=j;k<j+i;++k){
                //确定不同的终点 
                    jishu*=s[k];//连乘 
                    //尝试输出jishu,你就可以知道运行多少次
                    //cout<<jishu<<endl;(不用谢) 
                }
                ans=max(ans,jishu);//开始比较,并且换上较大的数到ans中 
            }
        }
        printf("Case #%d: The maximum product is %lld.\n\n",++cnt,ans);//我认为这个输出比较麻烦
        //不要忘记\n 
    }
    return 0;
}