解决问题:
对于分子和分母的数据范围过大
导致化成小数进行比较大小的时候
存在精度丢失,不能比较的情况
为此进行算式变形推出
故采用如下自定义函数:
ll bj(ll fz1,ll fm1,ll fz2,ll fm2){//分母相等if(fm1 == fm2){return fz1-fz2;}//分母不相等,公式变换ll tFZ1 = fz1*fm2;ll tFZ2 = fz2*fm1;return tFZ1-tFZ2;
}
题目示例:
解决代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int, int> pii;
typedef pair<db, db> pdd;const int N=2e5+6;struct node{int id;ll a,b;db win;
}arr[N];ll bj(ll fz1,ll fm1,ll fz2,ll fm2){//分母相等if(fm1 == fm2){return fz1-fz2;}//分母不相等--进行通分ll tFZ1 = fz1*fm2;ll tFZ2 = fz2*fm1;return tFZ1-tFZ2;
}bool cmp(node x,node y){if(bj(x.a,x.a+x.b,y.a,y.a+y.b)==0){return x.id<y.id;}return bj(x.a,x.a+x.b,y.a,y.a+y.b)>0?1:0;
}int main(){int n;cin>>n;db a,b;for(int i=1;i<=n;i++){arr[i].id=i;scanf("%lld%lld",&arr[i].a,&arr[i].b);db a=arr[i].a,b=arr[i].b;arr[i].win=a/(a+b);}sort(arr+1,arr+1+n,cmp);for(int i=1;i<=n;i++){printf("%d ",arr[i].id);}cout<<endl;return 0;
}