前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ZOJ 3194 Coverage(贪心)

ZOJ 3194 Coverage(贪心)

作者头像
用户1624346
发布2018-04-17 16:16:33
4500
发布2018-04-17 16:16:33
举报
文章被收录于专栏:calmound

题意:对于题目给的点,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次,而且是最小的两个值放在了两边)

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档