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;
    }
  • 相关阅读:
    sqlserver2005分页
    windows计划任务
    sqlserver 2005 通信格式
    sqlserver 导出数据到excel
    所有连接sqlserver 2005 数据库的驱动程序
    Sql 2000 中行转列的查询方法
    [转] ASP.NET中使用javascript
    [转]17种常用正则表达式
    正则式正反向预编译(实战)
    正则表达式的正反向预编译
  • 原文地址:https://www.cnblogs.com/zsboy/p/2955434.html
Copyright © 2011-2022 走看看