傳送門:QWQios
先考慮兩我的c++
a0 | b0 | |
---|---|---|
p1 | a1 | b1 |
p2 | a2 | b2 |
那麼知足:\(\huge ans1=\max(\frac{a0}{b1} , \frac{a0a1}{b2})\)this
a0 | b0 | |
---|---|---|
p2 | a2 | b2 |
p2 | a1 | b1 |
\(\huge ans2=\max(\frac{a0}{b2} , \frac{a0a2}{b1})\)spa
若是要讓ans1<ans2rest
設 \(k1=\frac{a0}{b1} , k2=\frac{a0a1}{b2} , k3=\frac{a0}{b2} , k4=\frac{a0a2}{b1}\)code
則 k1< k4排序
k2 > k3ci
若是要讓ans1
展開,得:\(\frac{a0a2}{b1} > \frac{a0a1}{b2}\)string
移項得:\(a1b1<a2b2\)
根據冒泡排序
兩個相鄰交換必定使答案更差
因此能夠根據ab的大小排序(下標排序)
而後就是麻煩的高精了
//自動無視c++14 // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e4+5; int n; // The MIT License (MIT) // Copyright (c) YEAR NAME // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. struct big{ static const int base=10000; int a[2333]; int len; big(){memset(a,'\000',sizeof a);len=1;} int& operator[](int x){return a[x];} big(int x){*this=x;} big& operator =(int x){ *this=big(); for(len=0;x;x/=base)a[++len]=x%base; if(!x)len=1; return *this; } friend big operator + (const big&a,const big& b){ big c; c.len=max(a.len,b.len); for(int i=1;i<=c.len;++i){ c[i+1]+=((c[i]+=(a.a[i]+b.a[i]))/base); c[i]%=base; } if(c[c.len+1])c.len++; return c; } friend big operator * (const big&a,const big& b){ big c; c.len=a.len+b.len-1; for(int i=1;i<=a.len;++i){ for(int j=1;j<=b.len;++j){ c[i+j-1]+=a.a[i]*b.a[j]; c[i+j]+=c[i+j-1]/base; c[i+j-1]%=base; } } while(c[c.len+1]){ c[c.len+1]+=c[c.len]/base; c[c.len]%=base; c.len++; } return c; } friend big operator + (const big a,int b){big c(b);return a+c;} friend big operator * (const big a,int b){big c(b);return a*c;} friend bool operator < (const big & a,const big&b){ if(a.len==b.len){ for(int i=a.len;i;--i){ if(a.a[i]!=b.a[i])return a.a[i]<b.a[i]; } }else{ return a.len<b.len; } return 0; } friend big operator / (const big& a,int x){ big ans; ans.len=a.len; int jw=0; for(int i=ans.len;i;--i){ ans[i]=(jw*base+a.a[i])/x; ((jw*=base)+=a.a[i])%=x; } while(!ans[ans.len]&&ans.len)ans.len--; return ans; } void print()const{printf("%d",a[len]); for(int i=len-1;i;i--){ printf("%04d",a[i]); } } friend ostream& operator << (ostream& out,const big& a){ a.print(); return out; } }; int a[maxn],b[maxn]; int bit[maxn]; big f[maxn]; big ans; big mul(1); int main(){ cin>>n; for(int i=0;i<=n;++i){ cin>>a[i]>>b[i]; big x(a[i]),y(b[i]); f[i]=x*y; bit[i]=i; } sort(bit+1,bit+1+n,[](const int& a,const int& b){ return f[a]<f[b]; }); for(int i=0;i<=n;++i){ if(i)ans=max(ans,mul/b[bit[i]]); mul=mul*a[bit[i]]; } ans.print(); return 0; }