您的位置:首页 > 产品设计 > UI/UE

HDU 5504 GT and sequence 模拟

2015-10-18 21:30 337 查看
给一串整数数字a[0] , a[1].....a
(a[i]<2^63-1),任意挑选出一个或一个以上的数,问怎样挑选出的数乘积最大。

模拟:

如果a[i]>0;直接乘;

如果a[i]==0 不乘;

如果a[i]<0 如果小于0的个数为偶数全乘,为奇数最大的负数(即绝对值最小)不乘。

特判两个情况:n==1 && a[0]<0 答案为a[0] ;数组a只含一个负数,然后其他都为0,答案为0;

题目思路不难想到,但是两个特判的情况容易遗漏;以后做这种题目要头脑冷静,也不要过分贪快,敲代码要准确而快速。

还有一个疑问:a[i]是<2^63-1;为什么乘积不会超过long long 范围。

原文:It guaranteed that **the absolute value of** any product of the numbers you choose in the initial sequence will not bigger than 。

难道是我英文不好。。流泪。。

<span style="font-size:18px;">#include <cstdio>
#include <algorithm>
using namespace std;
#define maxx(a,b) ((a>b)?a:b)
long long a[100];
int main()
{
int T,n,i;
long long ans;
scanf("%d",&T);
while(T--)
{
ans=1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
if(n==1 && a[0]<0)
{
printf("%lld\n",a[0]);
continue;
}
sort(a,a+n);
int k1=0,k2=-1,k3=-1;
for(i=0;i<n;i++)
{
if(a[i]<0)
k1=i+1;
else if(k2==-1 && a[i]==0)
k2=i;
else if(a[i]>0)
{
k3=i;
break;
}
}
if(k1!=0 && k3!=-1)
{
if(k1&1)
{
for(i=0;i<k1-1;i++)
ans*=a[i];
for(i=k3;i<n;i++)
ans*=a[i];
}
else
{
for(i=0;i<k1;i++)
ans*=a[i];
for(i=k3;i<n;i++)
ans*=a[i];
}

}
else if(k1!=0 && k3==-1)
{
if(k1&1)
{
for(i=0;i<k1-1;i++)
ans*=a[i];
}
else
{
for(i=0;i<k1;i++)
ans*=a[i];
}
}
else if(k1==0)
for(i=k3;i<n;i++)
ans*=a[i];
if(k2!=-1 && k3==-1 && k1==1)
ans=maxx(ans-1,0);
printf("%lld\n",ans);
}
return 0;
}
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: