思想:
联系所学数学知识,要求的式子的意义可以把p看成纵坐标,把s看成横坐标,然后求两点连线斜率的最大值。
若进行二重循环用两个for会超时,想别的方法,先将各个点按横坐标进行排序,然后相邻两点连线斜率的最大值即为所求。用sort函数先进行排序
#include<iostream> #include<algorithm> #include<math.h> using namespace std; const int maxn=1e5; struct build{ int area; int price; }; bool cmp(build&a,build&b) { return a.area<b.area; } int main(void){ int t,n,flag=0,result,i; scanf("%d",&t); build house[maxn]; while(t--){ double max=0; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d%d",&house[i].area,&house[i].price); } sort(house,house+n,cmp); for(i=0;i<n-1;i++){ if(house[i].area==house[i+1].area){ flag=1; break; } int x=abs(house[i].price-house[i+1].price); int y=abs(house[i].area-house[i+1].area); double result=x*1.0/y; //把x先化为浮点数,再进行运算,要不会只有整数部分 if(result>max){ max=result; } } if(flag==1) printf("-1\n"); else printf("%.6f\n",max); } return 0; }