求连乘最大
2016-04-15 08:47
316 查看
腾讯面试题,当时没解决,现在想想,好水,不敲题半年,不知不觉ACM快散功了,现在得捡起来了~
n个数,求出最大连乘
eg:
5
-8 -2 100 -0.5 100
最大连乘为 -2*100*(-0.5)*100=10000
dp 维护正的最大,负的最小
#include <cstdlib>
#include <cmath>
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 100000
double a[maxn];
double dp1[maxn];
double dp2[maxn];
int n;
int main()
{
while(~scanf("%d",&n))
{
double maxx;
for(int i=0;i<n;i++)
scanf("%lf",&a[i]),dp1[i]=dp2[i]=0;
maxx=a[0];
for(int i=0;i<n;i++)
{
maxx=max(maxx,a[i]);
if(a[i]>0)
dp1[i]=a[i];
if(a[i]<0)
dp2[i]=a[i];
}
for(int i=1;i<n;i++)
{
dp1[i]=max(max(dp1[i-1]*a[i],dp2[i-1]*a[i]),dp1[i]);
dp2[i]=min(min(dp2[i-1]*a[i],dp1[i-1]*a[i]),dp2[i]);
}
for(int i=0;i<n;i++) maxx=max(maxx,dp1[i]);
printf("%.2f\n",maxx);
}
return 0;
}
n个数,求出最大连乘
eg:
5
-8 -2 100 -0.5 100
最大连乘为 -2*100*(-0.5)*100=10000
dp 维护正的最大,负的最小
#include <cstdlib>
#include <cmath>
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 100000
double a[maxn];
double dp1[maxn];
double dp2[maxn];
int n;
int main()
{
while(~scanf("%d",&n))
{
double maxx;
for(int i=0;i<n;i++)
scanf("%lf",&a[i]),dp1[i]=dp2[i]=0;
maxx=a[0];
for(int i=0;i<n;i++)
{
maxx=max(maxx,a[i]);
if(a[i]>0)
dp1[i]=a[i];
if(a[i]<0)
dp2[i]=a[i];
}
for(int i=1;i<n;i++)
{
dp1[i]=max(max(dp1[i-1]*a[i],dp2[i-1]*a[i]),dp1[i]);
dp2[i]=min(min(dp2[i-1]*a[i],dp1[i-1]*a[i]),dp2[i]);
}
for(int i=0;i<n;i++) maxx=max(maxx,dp1[i]);
printf("%.2f\n",maxx);
}
return 0;
}
相关文章推荐
- 笔试面试基础
- 海量数据面试题整理
- 求最长公共子序列
- 电面:给一个数组找出和为k的两个数
- 从数组中选出n个数之和为k
- 使序列有序的最少交换次数
- Linux下fork()函数
- Google前招聘官:获得苹果、谷歌或微软工作的10个建议
- 面试基础知识整理--非常推荐
- 中国互联网巨头百度阿里腾讯(BAT)内部员工的真实情况大揭秘
- 2013互联网公司找工作--大牛总结(ZJU)
- 恶补Cpp系列——标准vector类型
- 编辑距离(Edit Distance | Levenshtein距离)
- LeetCode 049 Anagrams
- LeetCode 041 First Missing Positive
- LeetCode 069 Sqrt(x)
- LeetCode 082 Remove Duplicates from Sorted List II
- LeetCode 020 Valid Parentheses
- LeetCode 061 Rotate List
- LeetCode 092 Reverse Linked List II