给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。
输入可能包含多个测试样例。
每个测试样例的第一行仅包含正整数 n(n<=100000),表示浮点数序列的个数。
第二行输入n个浮点数用空格分隔。
输入数据保证所有数字乘积在双精度浮点数表示的范围内。
对应每个测试案例,输出序列中最大的连续子序列乘积,若乘积为浮点数请保留2位小数,如果最大乘积为负数,输出-1。
7 -2.5 4 0 3 0.5 8 -1 5 -3.2 5 -1.6 1 2.5 5 -1.1 2.2 -1.1 3.3 -1.1
12 64 8.78
#include<cstdio>
#include<cstdlib>
#define MAX 100001
using namespace std;
double Array[MAX];
double Max[MAX];
double Min[MAX];
double Maxnum(double a,double b,double c)
{
double max;
if((a>=b&&b>=c)||(a>=c&&c>=b))
max=a;
if((b>=a&&a>=c)||(b>=c&&c>=a))
max=b;
if((c>=a&&a>=b)||(c>=b&&b>=a))
max=c;
return max;
}
double Minnum(double a,double b,double c)
{
double min;
if((a<=b&&b<=c)||(a<=c&&c<=b))
min=a;
if((b<=a&&a<=c)||(b<=c&&c<=a))
min=b;
if((c<=a&&a<=b)||(c<=b&&b<=a))
min=c;
return min;
}
int main(int argc,char *argv[])
{
int i,n;
double maxans;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lf",&Array[i]);
maxans=Max[0]=Min[0]=Array[0];
for(i=1;i<n;i++)//动态规划求解
{
Max[i]=Maxnum(Array[i],Max[i-1]*Array[i],Min[i-1]*Array[i]);
Min[i]=Minnum(Array[i],Max[i-1]*Array[i],Min[i-1]*Array[i]);
if(Max[i]>maxans)
maxans=Max[i];
}
if(maxans>=0)
{//判断是否为浮点数
if(maxans-(int)maxans==0)
printf("%d\n",(int)maxans);
else
printf("%.2f\n",maxans);
}
else
printf("-1\n");
}
return 0;
}
原文:http://blog.csdn.net/cstopcoder/article/details/19036885