UVa 1643 Angle and Squares

题意:

如图,有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值。

分析:

直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大。(虽然我不太会证明,=_=||)

设所有正方形边长之和为L,OA、OB两直线方程分别为:y = k1x  y = k2x,设A(x1, k1x1), B(x2, k2x2),可列出方程:

,解得,相应的就得到AB两点坐标,用叉积算出△OAB的面积再减去这些正方形面积的一半就是答案。

 1 #include <cstdio>
 2 #include <algorithm>
 3
 4 struct Point
 5 {
 6     double x, y;
 7     Point(double x=0, double y=0):x(x), y(y) {}
 8 };
 9
10 double Cross(const Point& A, const Point& B)
11 { return A.x*B.y - A.y*B.x; }
12
13 int main()
14 {
15     //freopen("in.txt", "r", stdin);
16     int n;
17     while(scanf("%d", &n) == 1 && n)
18     {
19         Point A, B;
20         double L = 0, subArea = 0, l;
21         scanf("%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y);
22         for(int i = 0; i < n; ++i)
23         {
24             scanf("%lf", &l);
25             L += l;
26             subArea += l * l / 2;
27         }
28         double k1 = A.y / A.x, k2 = B.y / B.x;
29         if(k1 > k2) std::swap(k1, k2);
30         double x1 = (k1+1)*L/(k2-k1), y1 = k1 * x1;
31         double x2 = (k2+1)*L/(k2-k1), y2 = k2 * x2;
32         A = Point(x1, y1), B = Point(x2, y2);
33         double ans = Cross(A, B) / 2 - subArea;
34
35         printf("%.3f\n", ans);
36     }
37
38     return 0;
39 }

代码君

时间: 2024-10-09 00:48:34

UVa 1643 Angle and Squares的相关文章

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, 1

UVa 1643 Angle and Squares (计算几何)

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

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 201 - Squares(自己的方法,同学有更好一点点的方法)

#include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<algorithm> using namespace std; int h[20][20]; int v[20][20]; int size_[20]; int n,m; int flag; void judge(int x,int y)//这是关键部分的代码,用来判读那是否能构成sq

UVA - 201 Squares

Squares Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A children's board game consists of a square array of dots that contains lines connecting some of the pairs of adjacent dots. One part of the

uva 201 Squares 暴力

暴力 把边的信息装到一个field数组里面 第一维存水平线 第二维存竖直线 多重循环 先从边长为1正方形开始检查 每次检查都重新扫一下它的外圈 注意竖直线的地方它先给列坐标再给行坐标 输出有些繁琐 注意输出空行还有星星 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath

UVA - 201 Squares(模拟 + 暴力)

题意:给出一些单位线段, 问各种大小的正方形有多少个.要控制输出格式. 解题思路:模拟存储横线和竖线,暴力枚举各种尺寸,O(N ^ 4),此题数据弱, 实际所用时间很短. 题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19423 Memory: 0 KB   Time: 16 MS Language: C++ 4.8.2   Result: Accepted #include<algorithm> #include

【UVA】201 Squares(模拟)

题目 题目 ? ? 分析 记录一下再预处理一下. ? ? 代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf("%d",&s)==1) { if(t!=0) printf("\n**********************************\n\n"); int ans[11],H[21][21],V[21][21]; memset(V,0,sizeof(V))