洛谷 P1080国王游戏题解--zhengjun
思路
一看,高精度,参见高精度模板--zhengjun,这个模板十分好用(直接粘贴就可以了)。(代码中就不显示了)
然后,如果是这样的排列:
之前的\(a\)乘积为\(t\) | \(\cdots\) |
\(k\) | \(a_0,b_0\) |
\(k+1\) | \(a_1.b_1\) |
那么,如果这样排,这两行的答案就分别是\(ans_1=\max(t\div b_0,t\times a_0\div b_1)\) | |
如果倒着排,就是\(ans_2=\max(t\div b_1,t\times a_1\div b_0)\) |
如果\(ans_1<ans_2\)则\(\max(t\div b_0,t\times a_0\div b_1)<\max(t\div b_1,t\times a_1\div b_0)\)
转换一下\(\max(k_0,k_1)<\max(k_2,k_3)\)
因为\(t\times a_0\div b_1>t\div b_1\)即\(k_1>k_2\),而和对应的取一个\(\max\)就反过来了,所以\(k_0,k_1,k_2<k_3\),所以\(k_1<k_3\),也就是\(t\times a_0\div b_1<t\times a_1\div b_0\),所以\(a_0\times b_0<a_1\times b_1\),所以,如果这两个乘积谁大,谁放后面就会是答案小一点。
那么只要用乘积拍个序,然后就是高精度模拟。
代码
#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;
}