练习杂谈3
已知三角形三个顶点坐标求面积
处女座的签到题
我第一反应就是用海伦公式:
但是始终WA,因为double不能完美的把1018 这么大的数量都存下来,来个题解截图:
然后就是这个叉积,我简直不晓得是啥子东西,因为线代和高中的东西之前学的也撇,现在基本上都记不到了,这个问题我整了很久,真的要先复习一哈:线性代数复习博客
说实话,今天整这问题整的久不能全怪我太菜,我要是早点看到这篇文章我就懂了,我感觉我之前就是被误导了,也可能只是我没有理解到,其实完全就用高中的知识就行了,根本就用不到三阶行列式,下面这几篇文章一上来就扯三阶行列式,然后就是一套证明~我还攒了多大的劲看完了,始终感觉不对喃,虽然三阶行列式证明的结果和三角形三坐标面积公式相同,但总感觉思路上有点牵强
这样推荐下来肯定是对的,但是为啥可以把三个二维平面坐标变成两个三维向量?也就是看成(x1, x2, x3)和(y1, y2, y3)两个三维向量,而且这样算出来的结果还是向量,要想取模的话,应该是平方和再开根号三~,可能是我还没有理解,反正我又更简单的办法 ?
如下图,已知A,B,C三点,现要求这个三角形的面积,咋个办?用高中的知识可以解决当B点再零点的时候情况,就用我们熟悉
但是现在B不在零点,就稍微转换一哈就行了,BA就变成了向量a - b
,BC变成了向量c - b
,然后就用叉积。因为向量加减直接对应x,y坐标加减就行了,所以就很方便了,
公式 :abs( (x1-x2)*(y3-y2) - (x3-x2)*(y1-y2) )
利用向量积(叉积)计算三角形的面积和多边形的面积
叉乘坐标公式–求面积
向量叉积定义的证明
行列式求三角形面积的方法的推导
还有就是 nth_element()
函数,这个函数用来求第k小的数(也可以求第k大,自己写compare()函数就行了),效率说的有点高O(n),比先排序然后输出快~
用法见这篇文章:nth_element()函数用法详解
证书校验器
这道题我疯狂WA,有很多小细节都出了问题,最牛皮的小问题就是我用char
数组来装高精度,开始我都觉得着这个点问题都没得,高精度比较应该都是对的,但就是报错,最后突然才反应过来错就错在char
,多半是受了前面高精度的影响,我就用数组的0下标存放的长度,虽然这个思路没得问题,但是char
只有一个字节,所以根本不够用。。。
最近做题又遇到一个逆序数问题,用树状数组可以过,但是我看到网上还有用归并排序做的,有点意思,没想到归并排序还有这种功能,我没有代码实现,因为毕竟树状数组实现比较方便。还有就是求K大数,用的是快速排序,也就是 nth_element()函数用法详解
删数问题
这是个贪心,开始还以为排个序就出来了,还想想得太简单了
#include<iostream>
#include<cstdio>
#include<cstring>
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
*/