您的位置:首页 > 其它

HAUT1295 抽奖活动(高精度运算,河南省多校连萌(七))

2017-09-11 11:07 459 查看

题目描述

zc去参加抽奖活动,在抽奖箱里有n个球,每个球上写着一个数字。一次抽取两个球,得分为两个球上的数的乘积。为了中大奖,zc想要知道他能得到的最大得分为多少。

输入

第一行为T,代表样例数。(1<=T<=10) 其中每组样例,第一个数为n,代表球的数量,接下来n个数s1,s2…,sn,代表球上的数字。

(2<=n<=1e5,-4e9<=bi<=4e9)

输出

每组样例输出一行,输出一个数,代表zc得到的最大得分。(保证最大得分不小于0)

样例输入

2
3
1 2 3
3
-1 0 1


样例输出

6
0


思路:

先按照long long进行读入数据,从大到小排序,分情况讨论:

当n==2时:

如果两个数中有一个为0就输出0,否则输出他们的乘积(题目保证结果不小于0)

当n==3时:

找出三个数里面有几个负数,如果有两个的话,就输出两个负数的乘积,如果小于两个直接输出前两个就好了

当n>3时:

看前两个数里面有几个负数,如果有一个的话,那么最后两个肯定都是负数,直接把最后两个的乘积输出,如果有两个负数的话,那么最后面两个都是负数,肯定乘积大,输出最后面两个数的乘积。

当前面的两个数中没有负数的时候:

我们看最后两个数有几个负数,有一个负数的话,那么就输出这个数列的前两个的乘积,如果没有负数或者有两个负数的话,那么把前面两个的乘积和后面两个数的乘积作比较,然后输出最大的那个

代码:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <iostream>
#include <stack>
#include <sstream>
#include <cctype>
#include <map>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define mod 10000007
#define debug() puts("what the fuck!!!")
#define N 100+20
#define M 1000000+10
#define ll long long
using namespace std;
ll num[101000];
ll abss(ll k)
{
if(k<0)
return -k;
else
return k;
}
bool cmp(ll a,ll b)
{
return a>b;
}
string ltos(ll l)
{
ostringstream os;
os<<l;
string result;
istringstream is(os.str());
is>>result;
return result;
}
string multi_string_int(string a, int k)
{
if(k == 0) return "0";
int len = a.length(), carry = 0;
reverse(a.begin(), a.end());
for(int i = 0; i < len; i++)
{
int s = (a[i] - '0') * k + carry;
a[i] = s % 10 + '0';
carry = s / 10;
}
while(carry != 0)
{
a = a + (char)(carry % 10 + '0');
carry /= 10;
}
reverse(a.begin(), a.end());
return a;
}
string add(string a, string b)
{
string s;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int i = 0;
int m, k = 0;
while(a[i] && b[i])
{
m = a[i] - '0' + b[i] - '0' + k;
k = m / 10;
s += (m % 10 + '0');
i++;
}
if(i == a.size())
{
while(i != b.size())
{
m = k + b[i] - '0';
k = m / 10;
s += m % 10 + '0';
i++;
}
if(k) s += k + '0';
}
else if(i == b.size())
{
while(i != a.size())
{
m = k + a[i] - '0';
k = m / 10;
s += m % 10 + '0';
i++;
}
if(k) s += k + '0';
}
reverse(s.begin(), s.end());
return s;
}
string multi_string_string(string a, string b)
{
string ans = "";
for(int i = a.size() - 1; i >= 0; i--)
{
string tmp = multi_string_int(b, a[i] - '0');
for(int j = 0; j < a.size() - 1 - i; j++)
tmp += '0';
ans = add(ans, tmp);
}
return ans;
}
bool max_num(string s1,string s2)
{
if(s1.length()>s2.length())
return true;
else if(s1.length()<s2.length())
return false;
else
{
if(s1>s2)
return true;
else
return false;
}
}

int main()
{
ll t,n;
cin>>t;
while(t--)
{
cin>>n;
for(ll i=0; i<n; i++)
cin>>num[i];
sort(num,num+n,cmp);
if(n>3)
{
int k=0;//前两个数负数的个数
if(num[0]<0)k++;
if(num[1]<0)k++;
if(k==1)
{
string n1=ltos(abss(num[n-1]));
string n2=ltos(abss(num[n-2]));
string ans=multi_string_string(n1,n2);
cout<<ans<<endl;
}
else if(k==0)
{
if(num[n-1]<0)k++;
if(num[n-2]<0)k++;//后面两个数是负数的个数
if(k==0)
{
string n1=ltos(num[0]);
string n2=ltos(num[1]);
string ans1=multi_string_string(n1,n2);
if(ans1[0]=='0')ans1="0";
string n3=ltos(num[n-1]);
string n4=ltos(num[n-2]);
string ans2=multi_string_string(n3,n4);
if(ans2[0]=='0')ans2="0";
if(max_num(ans1,ans2))
cout<<ans1<<endl;
else
cout<<ans2<<endl;
}
else if(k==1)
{
string n1=ltos(num[0]);
string n2=ltos(num[1]);
string ans=multi_string_string(n1,n2);
if(ans[0]=='0')ans="0";
cout<<ans<<endl;
}
else if(k==2)
{
string n1=ltos(num[0]);
string n2=ltos(num[1]);
string ans1=multi_string_string(n1,n2);
if(ans1[0]=='0')ans1="0";
string n3=ltos(abss(num[n-1]));
string n4=ltos(abss(num[n-2]));
string ans2=multi_string_string(n3,n4);
if(ans2[0]=='0')ans2="0";
if(max_num(ans1,ans2))
cout<<ans1<<endl;
else
cout<<ans2<<endl;
}
}
else if(k==2)
{
string n1=ltos(abss(num[n-1]));
string n2=ltos(abss(num[n-2]));
string ans=multi_string_string(n1,n2);
cout<<ans<<endl;
}
}
else if(n==3)
{
int tmp=0;
for(int i=0; i<3; i++)
if(num[i]<0)
tmp++;
if(tmp>=2)
{
string n1=ltos(abss(num[1]));
string n2=ltos(abss(num[2]));
string ans=multi_string_string(n1,n2);
cout<<ans<<endl;
}
else
{
string n1=ltos(abss(num[0]));
string n2=ltos(abss(num[1]));
string ans=multi_string_string(n1,n2);
if(ans[0]=='0')ans="0";
cout<<ans<<endl;
}
}
else if(n==2)
{
if(num[0]==0||num[1]==0)
cout<<"0"<<endl;
else
{
string n1=ltos(abss(num[0]));
string n2=ltos(abss(num[1]));
cout<<multi_string_string(n1,n2)<<endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: