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

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啊绝望
纯按题意来的没有用数学方法
有野指针没改嘻嘻


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值