思路一
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;
}