HDU 5504 GT and sequence(给一堆数,求最大值,坑比较多)
原创
©著作权归作者所有:来自51CTO博客作者mb62ea10deefd92的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目地址:点击打开链接
思路:看着是水题,坑还是比较多的,(1)如果有正数,那么正数的全乘起来,如果还有超过2个的负数再乘以偶数个最小的负数,直到不能乘为止(2)如果只有超过2个的负数,则乘以偶数个最小的负数,直到不能乘为止(2)如果只有一个负数或没有负数,如果有0,输出0,没零,那就输出负数
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
__int64 a[70],b[70];
int main()
{
int t,n;
int i;
scanf("%d",&t);
while(t--)
{
int positive = 0,zero = 0,negative = 0;
__int64 sum = 1,x;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%I64d",&x);
if(x > 0)
{
positive++;
a[positive] = x;
}
else if(x == 0)
{
zero++;
}
else
{
negative++;
b[negative] = x;
}
}
sort(b+1,b+negative+1);//注意第二个参数,wrong了无数发,是negative,不是n
if(positive)
{
for(i=1; i<=positive; i++)
{
sum *= a[i];
}
for(i=1; i<=negative/2; i++)
{
sum *= b[2*i-1] * b[2*i];
}
printf("%I64d\n",sum);
continue;
}
if(negative > 1)
{
for(i=1; i<=negative/2; i++)
{
sum *= b[2*i-1] * b[2*i];
}
printf("%I64d\n",sum);
}
else
{
if(zero)
printf("0\n");
else
printf("%I64d\n",b[1]);
}
}
return 0;
}