题面传送门
思路
一看,高精度,参见高精度模板–zhengjun,这个模板十分好用(直接粘贴就可以了)。(代码中就不显示了)
然后,如果是这样的排列:
|
|
之前的
a乘积为
t |
⋯ |
k |
a0,b0 |
k+1 |
a1.b1 |
那么,如果这样排,这两行的答案就分别是
ans1=max(t÷b0,t×a0÷b1)
如果倒着排,就是
ans2=max(t÷b1,t×a1÷b0)
如果
ans1<ans2则
max(t÷b0,t×a0÷b1)<max(t÷b1,t×a1÷b0)
转换一下
max(k0,k1)<max(k2,k3)
因为
t×a0÷b1>t÷b1即
k1>k2,而和对应的取一个
max就反过来了,所以
k0,k1,k2<k3,所以
k1<k3,也就是
t×a0÷b1<t×a1÷b0,所以
a0×b0<a1×b1,所以,如果这两个乘积谁大,谁放后面就会是答案小一点。
那么只要用乘积拍个序,然后就是高精度模拟。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
struct zj{
int a,b;
bool operator < (const zj &x)const{
return a*b<x.a*x.b;
}
}a[1001];
bign pre,ans;
int main() {
scanf("%d",&n);
for(int i=0;i<=n;i++)scanf("%d%d",&a[i].a,&a[i].b);
sort(a+1,a+1+n);
ans=0;
pre=1;
for(int i=1;i<=n;i++){
pre*=a[i-1].a;
ans=max(ans,pre/a[i].b);
}
cout<<ans;
return 0;
}
谢谢–zhengjun