输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1<=18,-10<=Si<=10
2017-09-17 21:21
1576 查看
一开始看错题目,以为是可以排列的。
1.#include<algorithm>
#include <iterator>
#include<cstdio>
#include<set>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<math.h>
#include<stack>
#include<iostream>
#include<sstream>
#include<queue>
#include<cassert>
const int maxn=6000;
using namespace std;
deque<int>q,acle[8];
int a[25];
int main()
{//freopen("input.txt","r",stdin);
int mycount=0;
int n;
int k=0;
while(cin>>n)
{int count=0;
long long finalsum=0;
mycount++;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(k!=0)
{
cout<<"\n";
}
sort(a,a+n);
int negative_count=0;
int tranform_positvevalues=-1;
int tranform_negativevalues=-1;
int acount=0;
for(int i=0;i<n;i++)
{
if(i+1<n)
{if(a[i]*a[i+1]<=0&&acount==0)
{acount=1;
tranform_negativevalues=i;}
}
if(a[i]<0)
{
negative_count++;
}
if(a[i]>0)
{
break;
}
if(i+1<n)
{
if(a[i]*a[i+1]>=0&&a[i]>=0&&a[i+1]>=0)
tranform_positvevalues=i;
}
}
long long sum=1;
long long sum1=1;
if(tranform_positvevalues!=-1)
{int pd=0;
for(int i=tranform_positvevalues+1;i<n;i++)
{pd=1;
sum=sum*a[i];
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
if(tranform_negativevalues!=-1)
{ int pd=0;
sum=1;
sum1=1;
if(tranform_negativevalues%2==0)
{
for(int i=1;i<tranform_negativevalues+1;i++)
{ pd=1;
sum=sum*a[i];
}
}
else if(tranform_negativevalues%2==1)
{
for(int i=0;i<tranform_negativevalues+1;i++)
{ pd=1;
sum=sum*a[i];
}
}
if(tranform_positvevalues==-1)
{
for(int i=tranform_negativevalues+1;i<n;i++)
{pd=1;
sum1=sum1*a[i];
sum=sum*a[i];
}
if(sum<sum1)
{
sum=sum1;
}
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
if(tranform_positvevalues==-1&&tranform_negativevalues==-1)
{sum=1;
if(negative_count==0)
{
for(int i=0;i<n;i++)
{
sum=sum*a[i];
}
if(finalsum<sum1)
{
finalsum=sum;
}
}
else
{
if(n%2==0)
{
finalsum=0;
}
else
{int pd=0;
for(int i=0;i<n;i++)
{pd=1;
sum=sum*a[i];
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
}
}
if(n==0)
finalsum=0;
cout<<"Case #"<<mycount<<": The maximum product is "<<finalsum<<"."<<"\n";
k++;
}
}
1.#include<algorithm>
#include <iterator>
#include<cstdio>
#include<set>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<math.h>
#include<stack>
#include<iostream>
#include<sstream>
#include<queue>
#include<cassert>
const int maxn=6000;
using namespace std;
deque<int>q,acle[8];
int a[25];
int main()
{//freopen("input.txt","r",stdin);
int mycount=0;
int n;
int k=0;
while(cin>>n)
{int count=0;
long long finalsum=0;
mycount++;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(k!=0)
{
cout<<"\n";
}
sort(a,a+n);
int negative_count=0;
int tranform_positvevalues=-1;
int tranform_negativevalues=-1;
int acount=0;
for(int i=0;i<n;i++)
{
if(i+1<n)
{if(a[i]*a[i+1]<=0&&acount==0)
{acount=1;
tranform_negativevalues=i;}
}
if(a[i]<0)
{
negative_count++;
}
if(a[i]>0)
{
break;
}
if(i+1<n)
{
if(a[i]*a[i+1]>=0&&a[i]>=0&&a[i+1]>=0)
tranform_positvevalues=i;
}
}
long long sum=1;
long long sum1=1;
if(tranform_positvevalues!=-1)
{int pd=0;
for(int i=tranform_positvevalues+1;i<n;i++)
{pd=1;
sum=sum*a[i];
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
if(tranform_negativevalues!=-1)
{ int pd=0;
sum=1;
sum1=1;
if(tranform_negativevalues%2==0)
{
for(int i=1;i<tranform_negativevalues+1;i++)
{ pd=1;
sum=sum*a[i];
}
}
else if(tranform_negativevalues%2==1)
{
for(int i=0;i<tranform_negativevalues+1;i++)
{ pd=1;
sum=sum*a[i];
}
}
if(tranform_positvevalues==-1)
{
for(int i=tranform_negativevalues+1;i<n;i++)
{pd=1;
sum1=sum1*a[i];
sum=sum*a[i];
}
if(sum<sum1)
{
sum=sum1;
}
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
if(tranform_positvevalues==-1&&tranform_negativevalues==-1)
{sum=1;
if(negative_count==0)
{
for(int i=0;i<n;i++)
{
sum=sum*a[i];
}
if(finalsum<sum1)
{
finalsum=sum;
}
}
else
{
if(n%2==0)
{
finalsum=0;
}
else
{int pd=0;
for(int i=0;i<n;i++)
{pd=1;
sum=sum*a[i];
}
if(finalsum<sum&&pd==1)
{
finalsum=sum;
}
}
}
}
if(n==0)
finalsum=0;
cout<<"Case #"<<mycount<<": The maximum product is "<<finalsum<<"."<<"\n";
k++;
}
}
相关文章推荐
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。 Input 输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。 Output 对于每组
- 写正确程序需要注意的地方:输入一个正数n,输出所有和为n连续正数序列。
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
- 【每日面试题】输入一个正数n,输出所有和为n连续正数序列
- Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义
- 对于一个数组{1,2,3}它的子数组有{1,2},{1,3}{2,3},{1,2,3},元素之间可以不是连续的,对于数组{5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?
- 输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正数n,输出所有和为n的连续正数序列
- 输入一个正数 n,输出所有和为 n 的连续正数序列 [No. 25]
- 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
- 一个正整数有可能可以表示为n(n>=2)个连续的正整数之和,如:15=1+2+3+4+5,15=4+5+6,15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
- 习题 6.9 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。