题意:对于题目给的点,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
;
}

