zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    vsftpd 启动 vsftpd:500 OOPS: bad bool value in config file for: guest_enable
    Vsftpd服务传输文件(转)
    搭建FTP服务
    sed命令
    创建服务类脚本
    jvm 方法区
    B+与B-树
    适配器模式
    java 垃圾回收总结(可达性分析 引用分类
    HBase常见问题答疑解惑【持续更新中】
  • 原文地址:https://www.cnblogs.com/zsboy/p/2955434.html
Copyright © 2011-2022 走看看