题意:对于题目给的点,x固定,而与x组合的y可以任意交换,求如何安置y可使这些点组成线段下面的面积最大,最大面积是多少
分析:可以发现Xn-Xn-1的越大那么乘以y越大,所以我们只需求出,然后ΔX越大的数和y越大的数相乘在除以2就是结果,通过画图很容易得出结论
但是还有一个问题就是,对于i=0,i=n-1,Yi只乘以了一遍,而对于0<i<n的区间,每个Yi都乘以了两遍
所以在求ΔX时候,当i=0,ΔX=X1-X0,当i=n-1时,ΔX=Xn-1-Xn-2,而对于0<i<n,ΔX=Xi+1-xi-1;
这样就能确保每个y每个都可以被乘以了两次。
(对于两边的区间Y不仅被乘以了1次,而且是最小的两个值放在了两边)
#include<stdio.h> #include < string .h> #include <math.h> #include <algorithm> using namespace std; const int MN= 1100 ; double x[MN],y[MN],r[MN]; bool cmp( double a, double b) { return a< b; } int main() { int i,j,n; double sum; int T; scanf( " %d " ,& T); while (T-- ) { sum = 0 ; scanf( " %d " ,& n); for (i= 0 ;i<n;i++ ) scanf( " %lf%lf " ,&x[i],& y[i]); sort(x,x + n,cmp); sort(y,y + n,cmp); for (i= 0 ;i<n- 1 ;i++ ) { if (i== 0 ) r[i]=x[i+ 1 ]- x[i]; else r[i]=x[i+ 1 ]-x[i- 1 ]; } r[i] =x[i]-x[i- 1 ]; sort(r,r + n,cmp); for (i= 0 ;i<n;i++ ) { sum +=r[i]* y[i]; } printf( " %.1lf\n " ,sum/ 2 ); } return 0 ; }