思路一
long double 精度可能不够,直接交叉相乘需要 6 × (2 × 10 9 ) 2 > 2 64 .
转化为排序c i
a i +b i +c i ,交叉相乘只需要
3 × (2 × 10 9 ) 2 < 2 64
注意:记得一定是:long double。交叉相乘也还是会炸,所以是对c/(a+b+c)排序;
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; struct node { int id; long double v; }w[1005]; bool cmp(node x,node y) { if(x.v==y.v) return x.id<y.id; return x.v>y.v; } int main () { int n; while(cin>>n) { for (int i=0;i<n;i++) { long double a,b,c; cin>>a>>b>>c; w[i].v=c/(a+b+c); w[i].id=i+1; } sort(w,w+n,cmp); for (int i=0;i<n;i++) i==n-1?cout<<w[i].id<<endl:cout<<w[i].id<<" "; } return 0; }
思路二:
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; struct node { int id; long long a,b,c; }w[1005]; bool cmp(node x,node y) { return (x.a+x.b)*y.c<(y.a+y.b)*x.c; } int main () { int n; while(cin>>n) { for (int i=0;i<n;i++) { cin>>w[i].a>>w[i].b>>w[i].c; w[i].id=i+1; } stable_sort(w,w+n,cmp); for (int i=0;i<n;i++) i==n-1?cout<<w[i].id<<endl:cout<<w[i].id<<" "; } return 0; }