关于2018计蒜之道-贝壳找房性价比解题

    xiaoxiao2023-12-15  181

    2018计蒜之道-贝壳找房性价比

    题意

    贝壳找房有一个性价比比较的系统,对于两个房源a,b,a的价格为papa p_apa​​万元,面积sasa s_asa​平方米,b的价格为pbpb p_bpb​​万元,面积为sbsb s_bsb​​平方米。他们的绝对性价比差定义成为 $ \frac{|p_a - p_b|}{|s_a - s_b|}KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 44: …使得它们的绝对性价比差最大。 #̲###输入格式 输入第一行一个…s_i$, pipi p_ipi​​,分别表示第 i 个房源的面积为 sisi s_isi​​ 平方米,价格为 pipi p_ipi​​ 万元。 数据保证 1≤T≤50,2≤n≤105105 10^5105,∣si∣,∣pi∣≤108108 10^8108,并且 没有任何两个房源的面积和价格都一样。


    输出格式

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

    样例输入


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


    样例输出

    1.500000 -1


    题解

    会有T个数据组块 每个数据组块有n个数据组 每个数据组有2个数据 以这个思路可以让T和n都以数组存储,两个数据以结构体存储为pi,si


    代码

    TT是指向T的指针 ,Tn是指向n的指针 ,Tn是指向结构体的指针 , 动态malloc建立数组结构 out用来输出 p用来存储最大结果 指针aout 和 指针 Tp用来使指针指向开始位置 当分母相同时直接跳出两次循环


    #include<stdio.h> #include<malloc.h> #include<math.h> #define TMAX 50 #define TMIN 1 #define NMAX 100000 #define NMIN 2 #define PMAX 100000000 #define PMIN -100000000 typedef struct s{ int si; int pi; }HOUSE,*PHOUSE; int main(){ int T,n; scanf("%d",&T); if(T>TMAX) T = TMAX; else if(T<TMIN) T = TMIN; double *out = (double*)malloc(sizeof(double)*T); double *aout = out; HOUSE ***TT =(PHOUSE**)malloc(sizeof(PHOUSE) * T); HOUSE **Tp; for(int i=0;i<T;i++){ scanf("%d",&n); if(n<NMIN) n=NMIN; else if(n>NMAX) n=NMAX; HOUSE **Tn = (PHOUSE*)malloc(sizeof(PHOUSE)*n); *TT = Tn; Tp =Tn; for(int j=0;j<n;j++){ HOUSE *TH = (PHOUSE)malloc(sizeof(HOUSE)); scanf("%d",&TH->si); if(TH->pi>PMAX) TH->pi = PMAX; else if(TH->pi<PMIN) TH->pi = PMIN; scanf("%d",&TH->pi); if(TH->si>PMAX) TH->si = PMAX; else if(TH->si<PMIN) TH->si = PMIN; *Tn = TH; Tn++; } Tn = Tp; double p = -1; for(int oi = 0;oi<n-1;oi++){ for(int oj = oi+1;oj<n;oj++){ if((Tn[oi])->si == (Tn[oj])->si){ p = -1; goto loop; } if(p < (double)(abs((Tn[oi])->pi-(Tn[oj])->pi))/(double)(abs((Tn[oi])->si-(Tn[oj])->si))) p = (double)(abs((Tn[oi])->pi-(Tn[oj])->pi))/(double)(abs((Tn[oi])->si-(Tn[oj])->si)); } } loop: *out = p; out++; TT++; } out = aout; for(int i1=0;i1<T;i1++,out++) printf("%f\n",*out); return 0; }
    ps

    这个代码在计蒜客上运行1001ms,他的标准时1000ms差1ms啊绝望 纯按题意来的没有用数学方法 有野指针没改嘻嘻


    作者:霸王王艾达 来源: 版权声明:本文为博主原创文章,转载请附上博文链接!

    最新回复(0)