题目链接:http://exam.upc.edu.cn/problem.php?id=7039
题意:根据式子进行排序。
其实要是直接弄的话,精度出现问题。
所以需要化简一下:交叉相乘再变化一下。
最后化成 a1×c2 + b1×c2 <= a2×c1 + b2×c1
其实这样已经可以了。
因为很可能出现爆,所以需要long long 或者long double.
这题就完成了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef struct point{ ll a,b,c; int No; }p; p node[10050]; int cmp(p x,p y){ if((x.a+x.b)*y.c==x.c*(y.a+y.b)) return x.No<y.No; return (x.a+x.b)*y.c<x.c*(y.a+y.b); } int main() { int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ scanf("%lld%lld%lld",&node[i].a,&node[i].b,&node[i].c); node[i].No=i; } sort(node+1,node+1+n,cmp); for(int i=1;i<=n;i++){ printf("%d%c",node[i].No,i==n?'\n':' '); } } return 0; }