http://ac.jobdu.com/problem.php?pid=1501
如果一行数列里没有0,则
我的方法是用两个变量正数与负数,sum表示前面数的乘积, 随时将sum 正负归类放在两个变量里,
到 i 位置若为sum为负数,则在负数优先队列里找最大的负数去除
到 i 位置若为sum为正数,则在正数优先队列里找<1的正数去除
如果有0,则遇到0 就重新计算后面的数列
//7 -1.1 -2.2 -1.1 3.3 -1.1 -2.5 4
//2 0 2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> double zmin;//ᅰ�ᅧ� double Fmax;//ᄌ쳐� double inp[100099]; double dp[100099]; int main(){ int n; while(scanf("%d",&n)!=EOF){ int i; double sum=1; int zero=0; int zok=0,fok=0; for(i=1;i<=n;i++){ scanf("%lf",&inp[i]); if(zero==0){ sum=inp[i]; if(inp[i]==0)zero=0; else zero=1; dp[i]=inp[i]; zok=0; fok=0; if(inp[i]>0){ zok=1; zmin=inp[i]; } if(inp[i]<0){ fok=1; Fmax=inp[i]; } continue; } sum*=inp[i]; if(sum<0){ if(fok==1) dp[i]=sum/Fmax; else dp[i]=sum; if(fok==0){ fok=1; Fmax=sum; }else{ if(Fmax<sum)Fmax=sum; } continue; } if(sum>0){ if(zok==1&&zmin<1){ dp[i]=sum/zmin; }else dp[i]=sum; if(zok==0){ zok=1; zmin=sum; }else{ if(zmin>sum)zmin=sum; } continue; } if(sum==0){ dp[i]=0; zero=0; } } double max=-1; for(i=1;i<=n;i++){ if(dp[i]>max)max=dp[i]; } if(max<0)printf("-1 "); else { if(fabs(max-(int)max)<0.0000001) printf("%.0lf ",max); else printf("%.2lf ",max); } } return 0; }