寒假练习 07

断断续续终于刷完了计算几何专题,感觉太麻烦,小错误不断,尤其是精度问题。还有输出问题,有时候printf比cout要方便。

UVaOJ 10250

给出正方形的一组对角坐标,求另外两个坐标,用三角函数推到公式。

不妨设两点为A(x1, y1), C(x2, y2),则中点为G((x1 + x2) / 2, (y1 + y2) / 2),对角线长度为L = sqrt((x1 - x2)^2 - (y1-y2)^2)。

设直线AC与x轴的夹角为α,则sinα = (y2 - y1) / L,cosα = (x2 - x1) / L。

则另外两个坐标分别为B(Gx - L * sinα / 2, Gy + L * cosα / 2),D(Gx + L * sinα / 2, Gy - L * cosα / 2)。

#include <iostream>
#include <iomanip>
#include <math.h> 

using namespace std;

struct Point
{
	double x, y;
};

int main()
{
	Point a, b;
	while(cin >> a.x >> a.y >> b.x >> b.y)
	{
		Point c, d;
		double l = hypot(a.x - b.x, a.y - b.y);
		double sin = (a.y - b.y) / l;
		double cos = (a.x - b.x) / l;
		double x = (a.x + b.x) / 2.0;
		double y = (a.y + b.y) / 2.0;
		c.x = x - l * sin * 0.5;
		c.y = y + l * cos * 0.5;
		d.x = x + l * sin * 0.5;
		d.y = y - l * cos * 0.5;
		cout << fixed << setprecision(10) << c.x << " " << c.y << " " << d.x << " " << d.y << endl;
	}
	return 0;
}

  

UVaOJ 579

时钟每小时走30°,分钟每分钟走6°,模拟即可。

#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main()
{
	int h, m;
	while(scanf("%d:%d", &h, &m) != EOF)
	{
		if(h == 0 && m == 0) { break; }
		if(h == 12) { h = 0; }
		double dAngle = (h * 30.0 + m / 2.0) - m * 6.0;
		if(dAngle < 0) { dAngle = -dAngle; }
		if(dAngle > 180) { dAngle = 360 - dAngle; }
		printf("%.3f\n", dAngle);
	}
	return 0;
}

  

UVaOJ 375

等腰三角形内接圆直到半径小于1E-6,根据几何关系推得半径r = tan(arctan(2 * Height / Width) / 2) * Width / 2。

#include <stdio.h>
#include <math.h>

using namespace std;

const double PI = 4.0 * atan(1.0);

int main()
{
	int T;
	double x, y;
	scanf("%d", &T);
	for(int i = 1; i <= T; i++)
	{
		scanf("%lf%lf", &x, &y);
		double dSum = 0;
		double r = tan(atan(y / x * 2) / 2) * x / 2;
		while(r >= 1E-6)
		{
			dSum += r;
			x = x / y * (y - 2 * r);
			y -= 2 * r;
			r = tan(atan(y / x * 2) / 2) * x / 2;
		}
		printf("%13.6lf\n", 2 * PI * dSum);
		if(i != T) { printf("\n"); }
	}
	return 0;
}

  

UVaOJ 10387

根据几何关系,速度v = L / t,角度为arctan(y / x) * 180 / PI。

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

int main()
{
	double PI = acos(-1.0);
	double a, b, s, m, n;
	while(cin >> a >> b >> s >> m >> n)
	{
		if(a == 0 && b == 0 && s == 0 && m == 0 && n == 0) { break; }
		double x = a * m, y = b * n;
		double l = hypot(x, y);
		cout << fixed << setprecision(2) << atan(y / x) * 180.0 / PI << " " << l / s << endl;
	}
	return 0;
}

  

UVaOJ 10112

枚举各个点,判断是否满足条件,求三角形面积可以使用三阶行列式,判断点是否在三角形内可以使用S△ABC=S△ABD+S△ACD+S△BCD来判断。

#include <iostream>
#include <string>
#include <math.h>

using namespace std;

const int MAX = 128;

struct Tri
{
	char dwLabel;
	int x, y;
};

Tri pTri[MAX];

double fabs(double x);
double Area(int i, int j, int k);
bool Check(int i, int j, int k, int nPos);
string Solve(int N);

int main()
{
	int N;

	while(1)
	{
		cin >> N;
		if(N == 0) { break; }
		cin.ignore();
		for(int i = 1; i <= N; i++)
		{
			cin >> pTri[i].dwLabel >> pTri[i].x >> pTri[i].y;
			cin.ignore();
		}
		cout << Solve(N) << endl;
	}
	return 0;
}

string Solve(int N)
{
	double dMax = 0;
	string strAns = "000";
	for(int i = 1; i <= N; i++)
	{
		for(int j = 1; j <= N; j++)
		{
			if(i == j) { continue; }
			for(int k = 1; k <= N; k++)
			{
				if(k == i || k == j) { continue; }
				int nPos;
				for(nPos = 1; nPos <= N; nPos++)
				{
					if(nPos == i || nPos == j || nPos == k) { continue; }
					if(Check(i, j, k, nPos)) { break; }
				}
				if(nPos == N + 1 && Area(i, j, k) > dMax)
				{
					dMax = Area(i, j, k);
					strAns[0] = pTri[i].dwLabel;
					strAns[1] = pTri[j].dwLabel;
					strAns[2] = pTri[k].dwLabel;
				}
			}
		}
	}
	return strAns;
}

double Area(int i, int j, int k)
{ return fabs(0.5 * ((pTri[k].y - pTri[i].y) * (pTri[j].x - pTri[i].x) - (pTri[j].y - pTri[i].y) * (pTri[k].x - pTri[i].x))); }

bool Check(int i, int j, int k, int nPos)
{
	double dSum = Area(i, j, nPos) + Area(i, k, nPos) + Area(j, k, nPos);
	double dGap = dSum - Area(i, j, k);
	return (fabs(dGap) < 1E-8);
}

  

终于把小白书第一部分的推荐题目刷完了,总计65道。

时间: 2024-12-28 14:11:32

寒假练习 07的相关文章

百度房间卡是否可骄傲是快乐积分拉斯科

http://www.ebay.com/cln/ycn6646/-/167568259015/2015.02.07 http://www.ebay.com/cln/gon-n31/-/167197496017/2015.02.07 http://www.ebay.com/cln/hu_d027/-/167453250013/2015.02.07 http://www.ebay.com/cln/ywa2962/-/167301832012/2015.02.07 http://www.ebay.co

[2014年中总结-寒假]TGB之旅

又到了一个寒假的结束,先来说说这半年的工作情况: 9.03-11:07:金创中博工作SSH项目 11.10-01.27:参与ITOO1.0考试系统开发 01.28-02.16:担任ITOO2.0考试系统组长 9.03-11:07:金创中博工作SSH项目     这两个月的工作项目是<社保欠费查询系统>,从需求->开发,均是由个人独自完成.    工作的过程中收获了很多,而这些是你在大学期间无论如何也学习不到的!     1.沟通交流!与客户的业务沟通.与领导的汇报沟通,都是极其重要的.

《大四上寒假总结》--3.10

一.几个时间点 寒假离校:1.25 离家返校:1.31 -- 在家时间不到6天 返家准备做手术:2.9 从家返校:2.10 二.具体细节 主要分为三个阶段: 1.熬夜欢愉 2.家里的"幸福"生活 3.医院*N 4.伪复习 (1).考试周结束后的萎靡生活 1.15周六早最后一次数学讨论班结束.正式进入寒假. 室友已经陆续离开.最后的HYE两天后的周一中午飞机. 对于这段时间的记忆就是几乎每天都是看直播,同时身体超级难受 T^T..... 看直播痴迷到什么样的程度?特比喜欢一个叫鲍鲍的主播

笔试算法题(07):还原后序遍历数组 &amp; 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

java进阶07 线程的让步与阻塞与同步

前面介绍了线程的一些基本知识,现在来说下线程的让步,阻塞,和同步 先说说让步 所谓让步,就是让调用者的线程暂停,让其他线程重新竞争CPU,包括调用者. 先看看代码 package Thread; public class ThreadYield { public static void main(String[] args){ MyThread5 rthread=new MyThread5(); Thread thread1=new Thread(rthread); Thread thread2

P1807 最长路_NOI导刊2010提高(07)

P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入输出格式 输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式: 输出文件longest.out,一个整数,即1到n之间的最长路径.如

07:合影效果

07:合影效果 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念.如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)? 输入 第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生).后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数

U-BOOT-2016.07移植 (第一篇) 初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析 目录 U-BOOT-201607移植 第一篇 初步分析 目录 编译和移植环境 更新交叉编译工具 1 下载arm-linux-gcc 443 2 安装arm-linux-gcc 443 安装环境Ubuntu 910 下载u-boot-201607并解压 分析顶层Makefile 1 找出目标依赖关系 2 总结 初次编译u-boot 1 配置 2 编译 分析u-boot启动流程 1 分析startS 2 分析crt0S 3 总结 1. 编译和移

【博客美化】07.添加打赏按钮

博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加GitHub链接 [博客美化]06.添加QQ交谈链接 [博客美化]07.添加打赏按钮 1.添加打赏按钮 进入自己的博客园->设置,将以下html代码添加到“页首Html代码” <!--打赏 Start--> <script> window.tctipConfig = { staticP