练习杂谈3

练习杂谈3

已知三角形三个顶点坐标求面积

处女座的签到题
我第一反应就是用海伦公式:
在这里插入图片描述
但是始终WA,因为double不能完美的把1018 这么大的数量都存下来,来个题解截图:
练习杂谈3_第1张图片
然后就是这个叉积,我简直不晓得是啥子东西,因为线代和高中的东西之前学的也撇,现在基本上都记不到了,这个问题我整了很久,真的要先复习一哈:线性代数复习博客
说实话,今天整这问题整的久不能全怪我太菜,我要是早点看到这篇文章我就懂了,我感觉我之前就是被误导了,也可能只是我没有理解到,其实完全就用高中的知识就行了,根本就用不到三阶行列式,下面这几篇文章一上来就扯三阶行列式,然后就是一套证明~我还攒了多大的劲看完了,始终感觉不对喃,虽然三阶行列式证明的结果和三角形三坐标面积公式相同,但总感觉思路上有点牵强
练习杂谈3_第2张图片
这样推荐下来肯定是对的,但是为啥可以把三个二维平面坐标变成两个三维向量?也就是看成(x1, x2, x3)和(y1, y2, y3)两个三维向量,而且这样算出来的结果还是向量,要想取模的话,应该是平方和再开根号三~,可能是我还没有理解,反正我又更简单的办法 ?

如下图,已知A,B,C三点,现要求这个三角形的面积,咋个办?用高中的知识可以解决当B点再零点的时候情况,就用我们熟悉
在这里插入图片描述
练习杂谈3_第3张图片
但是现在B不在零点,就稍微转换一哈就行了,BA就变成了向量a - b,BC变成了向量c - b,然后就用叉积。因为向量加减直接对应x,y坐标加减就行了,所以就很方便了,
公式 :abs( (x1-x2)*(y3-y2) - (x3-x2)*(y1-y2) )
练习杂谈3_第4张图片

利用向量积(叉积)计算三角形的面积和多边形的面积
叉乘坐标公式–求面积
向量叉积定义的证明
行列式求三角形面积的方法的推导

还有就是 nth_element()函数,这个函数用来求第k小的数(也可以求第k大,自己写compare()函数就行了),效率说的有点高O(n),比先排序然后输出快~
用法见这篇文章:nth_element()函数用法详解



证书校验器
这道题我疯狂WA,有很多小细节都出了问题,最牛皮的小问题就是我用char数组来装高精度,开始我都觉得着这个点问题都没得,高精度比较应该都是对的,但就是报错,最后突然才反应过来错就错在char,多半是受了前面高精度的影响,我就用数组的0下标存放的长度,虽然这个思路没得问题,但是char只有一个字节,所以根本不够用。。。

最近做题又遇到一个逆序数问题,用树状数组可以过,但是我看到网上还有用归并排序做的,有点意思,没想到归并排序还有这种功能,我没有代码实现,因为毕竟树状数组实现比较方便。还有就是求K大数,用的是快速排序,也就是 nth_element()函数用法详解

删数问题
这是个贪心,开始还以为排个序就出来了,还想想得太简单了

#include
#include
#include
using namespace std;
#define maxn 500
char input[maxn];
char shuzu[maxn];

int find(int l, int r){
	int index = l;
	for(int i = l+1; i <= r; i ++){
		if(input[i] < input[index]) index = i;
	}
	return index;
}

int main(){
	scanf("%s", input);
	int s, length;
	cin >> s;
	length = strlen(input);
	s = length - s;
	int l = 0, r = length - s;
	length = 0;
	while(s --){
		l = find(l, r);
		shuzu[length ++] = input[l];
		l ++; r ++;
	}
	int i = 0;
	while(shuzu[i] == '0' && i<length-1) i ++;
	for(; i < length; i ++) printf("%c", shuzu[i]);
	return 0;
} 

/*
30000001000000
2
5551178
3
*/

你可能感兴趣的:(算法,杂谈,算法)