UVA - 1643 Angle and Squares (角度和正方形)(几何)

题意:第一象限里有一个角,把n(n <= 10)个给定边长的正方形摆在这个角里(角度任意),使得阴影部分面积尽量大。

分析:当n个正方形的对角线在一条直线上时,阴影部分面积最大。

1、通过给定的xa,ya,xb,yb,可求k1,k2。

2、当n个正方形的对角线在一条直线上时,设A(x1,k1*x1),B(x2,k2*x2),

可列方程组:

解得

3、利用叉积算出AOB的面积,再减去正方形面积和的一半。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b) {
    if(fabs(a - b) < eps)  return 0;
    return a < b ? -1 : 1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 1000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
struct Point{
    double x, y;
    void set(double xx, double yy){
        x = xx;
        y = yy;
    }
};
double getArea(Point &A, Point &B){
    return A.x * B.y - A.y * B.x;
}
int main(){
    int N;
    while(scanf("%d", &N) == 1){
        if(!N) return 0;
        Point A, B;
        scanf("%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y);
        double L = 0;
        double area = 0;
        for(int i = 0; i < N; ++i){
            double l;
            scanf("%lf", &l);
            L += l;
            area += l * l / 2;
        }
        double k1 = A.y / A.x;
        double k2 = B.y / B.x;
        if(k1 > k2){
            swap(k1, k2);
        }
        double x1 = (k2 + 1) * L / (k2 - k1);
        double y1 = k1 * x1;
        double x2 = (k1 + 1) * L / (k2 - k1);
        double y2 = k2 * x2;
        A.set(x1, y1);
        B.set(x2, y2);
        double ans = getArea(A, B) / 2 - area;
        printf("%.3lf\n", ans);
    }
    return 0;
}

  

时间: 2024-12-17 23:05:16

UVA - 1643 Angle and Squares (角度和正方形)(几何)的相关文章

UVa 1643 Angle and Squares (计算几何)

题意:有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 析:很容易知道只有所有的正方形的对角形在一条直线时,是最大的,然后根据数学关系,就容易得到答案. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #incl

UVa 1643 Angle and Squares

题意: 如图,有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 分析: 直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大.(虽然我不太会证明,=_=||) 设所有正方形边长之和为L,OA.OB两直线方程分别为:y = k1x  y = k2x,设A(x1, k1x1), B(x2, k2x2),可列出方程: ,解得,相应的就得到AB两点坐标,用叉积算出△OAB的面积再减去这些正方形面积的一半就是答案. 1 #includ

习题10-3 角度和正方形 UVa1643

1.题目描述:点击打开链接 2.解题思路:本题是一道数学题.通过试验可以发现,不管第一个正方形放在哪里,第二个正方形总可以恰好放入第一个正方形和最下面那条射线之间.而且第一个正方形放的越靠上,中间围出来的阴影部分就越大.因此当第一个正方形和第二个正方形的对角线重合时,阴影面积达到最大.此时不难通过几何关系列式计算出阴影部分的面积. 其实也可以换一种理解方式,首先统计出所有小正方形的边长之和为L,那么以L为边长的大正方形夹在角中的阴影面积是确定的,而这些小正方形又可以恰好沿着大正方形的对角线放置,

UVa1643 - Angle and Squares(几何)

有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 分析: 直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大.(虽然我不太会证明,=_=||) 设所有正方形边长之和为L,OA.OB两直线方程分别为:y = k1x  y = k2x,设A(x1, k1x1), B(x2, k2x2),可列出方程: ,解得,相应的就得到AB两点坐标,用叉积算出△OAB的面积再减去这些正方形面积的一半就是答案. #include<cstdio>

【习题 7-6 UVA - 12113】Overlapping Squares

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出来一个正方形. 然后每次枚举新加的正方形左上角的坐标就可以. 注意覆盖的规则,控制一下就可以. 然后暴力判断是否相同. 暴力回溯即可(只用回溯一个正方形区域) [代码] /* 1.Shoud it use long long ? 2.Have you ever test several sample(at least therr) yourself? 3.Can you promise that the solutio

【UVA】1342 - That Nice Euler Circuit(几何+欧拉定理)

E 为边数 ,V 为点数,F为面数 那么 F = E + 2 - V(其中包括了一个无限大的面) 这道题被自己的习惯坑了一下#define MAXD 300 + 10 和#define MAXD 310 是不一样的 14113235 1342 That Nice Euler Circuit Accepted C++ 0.082 2014-08-29 15:12:20 自己的代码: #include<cstdio> #include<cstring> #include<iost

uva 12304 - 2D Geometry 110 in 1!(几何)

题目链接:uva 12304 - 2D Geometry 110 in 1! 没什么好说的,根据操作直接处理. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; const double pi = 4 * atan(1); const double eps = 1e-9;

根据中心点、半径长度和角度画点

直接上代码: 需要引用 Math 单元. procedure CenterRadiusPoint(const PX, PY: Integer; const Angle: Double; const Radius: Integer; var X, Y: Integer); var AngleHude: Double; begin AngleHude := Angle * PI / 180; // 角度变成弧度 X := Round(Radius * Cos(AngleHude)) + PX; Y

Unity_角度_弧度_向量-----(最近遇到一点这方面的小问题,发现有些遗忘了,特此温故,并摘抄了部分大佬们的优秀注释)

1,角度 两条相交直线中的任何一条与另一条相叠合时必须转动的量的量度,转动在这两条直线的所在平面上并绕交点进行. 角度是用以量度角的单位,符号为°.一周角分为360等份,每份定义为1度(1°). 之所以采用360这数值,是因为它容易被整除.360除了1和自己,还有21个真因子(2.3.4.5.6.8.9.10.12.15.18.20.24.30.36.45.60.72.90.120.180),所以很多特殊的角的角度都是整数. 2.弧度 在数学和物理中,弧度是角的度量单位.它是由国际单位制导出的单