确定一种排列方式满足题目要求。
首先对于两个大臣分析(联想到排序算法中cmp比较函数,也是按照某种规则比较两个量,这里我们也分析两个),若1和2要交换,需满足max{a0/b1, (a0*a1)/b2} > max{a0/b2, (a0*a2)/b1},同时约去a0, max{1/b1, a1/b2} > max{1/b2, a2/b1},注意到1/b1 <= a2/b1,a1/b2 >= 1/b2。
只需满足a1/b2 > a2/b1, 即a1*b1 > a2*b2。所以我们按照a*b升序排列。
套上高精度乘法, 高精/低精除法模板。
#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
int a, b;
char cnta[10005];//a前缀积(除当前a)
char ca[1005];//a字符
char ans[10005];//获得金币数
//字符均为倒序,用char类型便于直接得到len
int lans;
}mi[1005];//minister
bool cmp(node x, node y) {//按a*b升序排列
return x.a * x.b < y.a * y.b;
}
bool cmp2(node x, node y) {
if (x.lans != y.lans) return x.lans > y.lans;
else {
for (int i = 0; i <= x.lans; i ++)
if (x.ans[i] == y.ans[i]) continue;
else return x.ans[i] > y.ans[i];
}
return 1;
}
void trans(int a, char b[]) {
int p = 0;
while (a) {
b[p ++] = a % 10 + '0';
a
确定排列方式的算法分析

最低0.47元/天 解锁文章
1129

被折叠的 条评论
为什么被折叠?



