给定一个浮点数序列(可能有正数、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