贝壳找房有一个性价比比较的系统,对于两个房源 aa,bb,aa 的价格为 p_apa 万元,面积 s_asa 平方米,bb 的价格为 p_bpb万元,面积为 s_bsb 平方米。他们的绝对性价比差定义成为 \displaystyle \frac{|p_a - p_b|}{|s_a - s_b|}∣sa−sb∣∣pa−pb∣。
现在给出 nn 个房源的价格和面积,请你求出一对房源使得它们的绝对性价比差最大。
输入格式
输入第一行一个整数 TT 表示数据组数。
接下来输入 TT 组数据,每一组数据按照下面格式输入。
第一行输入一个整数 nn 表示房源的个数。
接下来 nn 行,每行输入两个整数 s_i, p_isi,pi,分别表示第 ii 个房源的面积为 s_isi 平方米,价格为 p_ipi 万元。
数据保证 1 \le T \le 501≤T≤50,2 \le n \le 10^5, |s_i|, |p_i| \le 10^82≤n≤105,∣si∣,∣pi∣≤108,并且 没有任何两个房源的面积和价格都一样。
输出格式
对于每组数据输出一行,如果该组数据的答案趋向于无穷大,输出 -1−1,否则,输出最大的绝对性价比差。(所有输出误差在 10^{-6}10−6 以内都可以被接受)。
本题答案不唯一,符合要求的答案均正确
样例输入
2 4 1 3 4 5 7 8 3 6 2 4 10 4 11
样例输出
1.500000 -1
题目来源
题解:结构体储存,按照面积sort排个序,判断性价比最高,就是判断相邻两个点的斜率。如果斜率是90度的,就输出-1.
为了防止精度的丢失,最好变量用double类型,同时判断-1的那种情况,单独开个整形变量判断,用储存的斜率去判断wa到哭..
同时不要cin,cout,会超时,就算ios::sync_with_stdio取消同步都没有用。
#include<bits/stdc++.h> using namespace std; struct node { double s,p; } q[101000]; bool cmp(node a,node b) { return a.s<b.s; } int main() { int t,n; scanf("%d",&t); while(t--) { int f=1; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%lf%lf",&q[i].s,&q[i].p); sort(q,q+n,cmp); double maxn=0; for(int i=1; i<n; i++) { if(q[i].s==q[i-1].s) { f=0; break; } maxn=max(maxn,fabs(q[i].p-q[i-1].p)/fabs(q[i].s-q[i-1].s)); } if(!f) cout<<-1<<endl; else printf("%.6lf\n",maxn); } return 0; }