zoukankan      html  css  js  c++  java
  • poj2722

    题意:给出若干个正方形的边长,和平面直角坐标系中的两条起点在原点的射线(射线上的点表示射线),两条射线在第一象限。要求用这些正方形和这两条射线围成一块封闭的面积,求最大面积。

    分析:把正方形对角线连成一条直线,排成一个斜率为-1的直线。这样才能保证面积最大。

    所以现在的问题变为,已知两条射线的方向,以及三角形第三条边的斜率(斜率为-1)和长度(正方形边长和×sqrt(2))求三角形的面积(当然最终结果是三角形面积减去正方形面积的一半)

    设有a,b两向量,方向是两射线方向,设ka*a为三角形的一条射线上的边,kb×b为三角形另一条射线上的边。(即将两向量适当延长)

    延长后两向量的差即为第三条边的向量,由于第三条边斜率为-1,所以其对应向量的横纵坐标相等。且均等于正方形边长之和,设边长之和为a

    可得方程:ka * xa - kb * xb = kb * yb - ka * ya = a

    我们要求的三角形面积用叉积方法表示为:ka * xa * kb * yb - kb * xb * ka * xa

    整理可得最终三角形面积为:a * a * (xa + ya) * (xb + yb) / (xa * yb - xb * ya)

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    usingnamespace std;

    int n;

    void swap1(double&a, double&b)
    {
    double t = a;
    a
    = b;
    b
    = t;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    while (scanf("%d", &n), n)
    {
    double xa, ya, xb, yb;
    double a =0, s =0;
    scanf(
    "%lf%lf%lf%lf", &xa, &ya, &xb, &yb);
    if (ya / xa > yb / xb)
    {
    swap1(ya, yb);
    swap1(xa, xb);
    }
    for (int i =0; i < n; i++)
    {
    double x;
    scanf(
    "%lf", &x);
    a
    += x;
    s
    += x * x;
    }
    double ans = ((xa + ya) * a * (xb + yb) / (xa * yb - xb * ya) * a - s) /2;
    printf(
    "%.3f\n", (double)ans);
    }
    return0;
    }
  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/rainydays/p/2104059.html
Copyright © 2011-2022 走看看