洛谷P1080国王游戏题解--zhengjun

题面传送门

思路

一看,高精度,参见高精度模板–zhengjun,这个模板十分好用(直接粘贴就可以了)。(代码中就不显示了)

然后,如果是这样的排列:

之前的 a a 乘积为 t t \cdots
k k a 0 , b 0 a_0,b_0
k + 1 k+1 a 1 . b 1 a_1.b_1

那么,如果这样排,这两行的答案就分别是 a n s 1 = max ( t ÷ b 0 , t × a 0 ÷ b 1 ) ans_1=\max(t\div b_0,t\times a_0\div b_1)
如果倒着排,就是 a n s 2 = max ( t ÷ b 1 , t × a 1 ÷ b 0 ) ans_2=\max(t\div b_1,t\times a_1\div b_0)

如果 a n s 1 < a n s 2 ans_1<ans_2 max ( t ÷ b 0 , t × a 0 ÷ b 1 ) < max ( t ÷ b 1 , t × a 1 ÷ b 0 ) \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 ) \max(k_0,k_1)<\max(k_2,k_3)

因为 t × a 0 ÷ b 1 > t ÷ b 1 t\times a_0\div b_1>t\div b_1 k 1 > k 2 k_1>k_2 ,而和对应的取一个 max \max 就反过来了,所以 k 0 , k 1 , k 2 < k 3 k_0,k_1,k_2<k_3 ,所以 k 1 < k 3 k_1<k_3 ,也就是 t × a 0 ÷ b 1 < t × a 1 ÷ b 0 t\times a_0\div b_1<t\times a_1\div b_0 ,所以 a 0 × b 0 < a 1 × b 1 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;
}

谢谢–zhengjun

原创文章 115 获赞 118 访问量 6501

猜你喜欢

转载自blog.csdn.net/A_zjzj/article/details/105662372
今日推荐