A. 贝壳找房性价比

贝壳找房有一个性价比比较的系统,对于两个房源 aabbaa 的价格为 p_apa 万元,面积 s_asa 平方米,bb 的价格为 p_bpb万元,面积为 s_bsb 平方米。他们的绝对性价比差定义成为 \displaystyle \frac{|p_a - p_b|}{|s_a - s_b|}sasbpapb

现在给出 nn 个房源的价格和面积,请你求出一对房源使得它们的绝对性价比差最大。

输入格式

输入第一行一个整数 TT 表示数据组数。

接下来输入 TT 组数据,每一组数据按照下面格式输入。

第一行输入一个整数 nn 表示房源的个数。

接下来 nn 行,每行输入两个整数 s_i, p_isi,pi,分别表示第 ii 个房源的面积为 s_isi 平方米,价格为 p_ipi 万元。

数据保证 1 \le T \le 501T502 \le n \le 10^5, |s_i|, |p_i| \le 10^82n105,si,pi108,并且 没有任何两个房源的面积和价格都一样

输出格式

对于每组数据输出一行,如果该组数据的答案趋向于无穷大,输出 -11,否则,输出最大的绝对性价比差。(所有输出误差在 10^{-6}106 以内都可以被接受)。

本题答案不唯一,符合要求的答案均正确

样例输入

2
4
1 3
4 5
7 8
3 6
2
4 10
4 11

样例输出

1.500000
-1

题目来源

2018 计蒜之道 初赛 第三场


题解:结构体储存,按照面积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;
}

猜你喜欢

转载自blog.csdn.net/memory_qianxiao/article/details/80472480