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

1.题目描述:点击打开链接

2.解题思路:本题是一道数学题。通过试验可以发现,不管第一个正方形放在哪里,第二个正方形总可以恰好放入第一个正方形和最下面那条射线之间。而且第一个正方形放的越靠上,中间围出来的阴影部分就越大。因此当第一个正方形和第二个正方形的对角线重合时,阴影面积达到最大。此时不难通过几何关系列式计算出阴影部分的面积。

其实也可以换一种理解方式,首先统计出所有小正方形的边长之和为L,那么以L为边长的大正方形夹在角中的阴影面积是确定的,而这些小正方形又可以恰好沿着大正方形的对角线放置,可以算出剩余部分阴影的面积。两个阴影面积之和即为答案。该过程详细部分见代码。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 10+5
double d[N];
int n;
double xa, ya, xb, yb;
double ans;

void update(double len)//计算以len为边长的正方形夹在角中的阴影面积
{
	double x1, y1, x2, y2;
	double e1 = ya / xa, e2 = yb / xb;
	if (e1 < e2){
		swap(e1, e2); swap(xa, ya); swap(xb, yb);
	}
	x1 = (1 + e2)*len / (e1 - e2);
	x2 = x1 + len;
	y1 = e1*x1, y2 = e2*x2;
	ans = (len + x2)*y1 / 2 - len*len - x2*y2 / 2;
}
int main()
{
	//freopen("t.txt", "r", stdin);
	while (~scanf("%d", &n) && n)
	{
		scanf("%lf%lf%lf%lf", &xa, &ya, &xb, &yb);
		ans = 0.0;
		memset(d, 0, sizeof(d));
		double L = 0.0;
		for (int i = 0; i < n; i++)
		{
			scanf("%lf", &d[i]);
			L += d[i];
		}
		update(L);
		double res = L*L;
		for (int i = 0; i < n; i++)
			res -= d[i] * d[i];
		ans += res/2;//第二部分阴影的面积
		printf("%.3lf\n", ans);
	}
	return 0;
}
时间: 2024-10-25 23:53:34

习题10-3 角度和正方形 UVa1643的相关文章

C语言程序设计教程(第三版)课后习题10.4

1353: C语言程序设计教程(第三版)课后习题10.4 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 296  Solved: 219[Submit][Status][BBS] Description 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. Input 输入数据的个数n n个整数移动的位置m Output 移动后的n个数 Sample Input

问题 1047: C语言程序设计教程(第三版)课后习题10.5

/******************************************************************** @file Main.cpp @date 2017-06-01 12:17:46 @author Zoro_Tiger @brief 问题 1047: C语言程序设计教程(第三版)课后习题10.5 http://www.dotcpp.com/oj/problem1047.html ***************************************

问题 1043: C语言程序设计教程(第三版)课后习题10.1

/******************************************************************** @file Main.cpp @date 2017-05-29 12:55:07 @author Zoro_Tiger @brief 问题 1043: C语言程序设计教程(第三版)课后习题10.1 http://www.dotcpp.com/oj/problem1043.html ***************************************

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

10月22日 正方形

题目 1177.正方形 时间限制:1000MS内存限制:64000KB 题目描述 又到暑假啦,Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快玩耍(然而你却不行……).Ayumi, Mitsuhiko, Genta依次开始画正方形(显然Ai是不会参加这个活动的),一人一笔,画完一个,以上一个正方形四边中点为顶点接着画啊画啊画啊……最后一共画了k个正方形.最终他们想知道自己各画了多长. [样例解释] 输入 输入一行包含两个整数N,K,分别表示第一个正方形的边长,

第一章 课后习题 10

1 #include <iostream> 2 using namespace std; 3 int main() 4 { void sort(int x,int y,int z); 5 int x,y,z; 6 cin>>x>>y>>z; 7 sort(x,y,z); 8 return 0; 9 } 10 void sort(int x,int y,int z) 11 { 12 int temp; 13 if(x>y) {temp=x;x=y;y=t

1046: C语言程序设计教程(第三版)课后习题10.4

题目描述 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 输入 输入数据的个数n n个整数 移动的位置m 输出 移动后的n个数 样例输入 10 1 2 3 4 5 6 7 8 9 10 2 样例输出 9 10 1 2 3 4 5 6 7 8 1 #include <stdio.h> 2 #define N 100 3 4 // 移动一次 5 move(int a[], int n) 6 { 7 int

APUE 第三版 习题 10.5

这是书本上的答案: See ''Implementing Software Timers'' by Don Libes (C Users Journal, vol. 8, no. 11, Nov. 1990) for an example. A copy of this paper is available online at http://www.kohala.com/start/libes.timers.txt. 我参考上面提到的文档,使用 alarm() 以及time() 简略测试了一下.

常见问题总结之习题10

斜杠  /   反斜杠 \ %r打印代码里的原始字符串,其中包含原始的转义字符.%r用户调试,%s用户显示. print 后每一行增加一个(,),这样print就不会输出换行符而结束这一行跑到下一行去了. input和raw_input区别:input会假设用户输入的是合法的python表达式/raw_input会把所有的输入当作原始数据,然后将其放入字符串中(). 原文地址:https://www.cnblogs.com/corewarsbin/p/10895681.html