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; }
相关文章推荐
- POJ 1001:Exponentiation —— 高精度浮点数运算
- poj 1001 Exponentiation(高精度运算)
- 高精度运算模板
- html5+css3实现抽奖活动的效果
- 高精度运算——阶乘
- 目前我所掌握最全的高精度(大数)运算(第一次)
- 网站抽奖活动页面设计及制作
- java BigDecimal 高精度运算 小数点处理详解
- 高精度运算
- 【高精度】【高精度四则运算模板】高精度除法
- 【高精度运算】
- c++高精度运算(加、乘)
- 论坛盖楼抽奖活动总结
- 高精度四则运算模板
- QQ活动助手,通过作者也就是我搜集各种QQ有关的活动,整理成软件的形式让大伙参加,实现一键参与和抽奖的一款小软件。。O(∩_∩)O~不过涉及的东西还是挺多的
- 高精度运算——实数乘法
- hdu4927 Series 1(组合+公式 Java大数高精度运算)
- 活动抽奖页面
- java中进行高精度、大数运算总结BigInteger BigDecimal
- JAVA高精度数值运算方法,小数点后保留位数,结合相关例题进行介绍!