ZOJ 3194 Coverage(贪心)
题意:对于题目给的点,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; }