首页 > 其他分享 >叉积

叉积

时间:2024-11-11 20:29:36浏览次数:2  
标签:容器 int double 输入输出 叉积 include

向量基本运算

点积

叉积

一.Transmitters

由叉积的基本定理得出,要判断一个点c再一条直线ab的左边还是右边,只要看(b-a)*(c-a)大于0还是小于0,对于这题,我们可以将左右边看成发射范围的半圆,因为要找出覆盖最多点的数量,所以最优解肯定有一个点再直径上,再通过叉积找出所有在这个点左侧的点。并且在初始化的时候,如果发现一个点到圆心的距离大于圆的半径,那这个点就不用考虑了。

点击查看代码
#include <iostream>  // 输入输出流
#include <iomanip>   // 输入输出格式控制
#include <fstream>   // 文件输入输出流
#include <sstream>   // 字符串输入输出流
#include <cmath>     // 数学函数
#include <string>    // 字符串操作
#include <vector>    // 动态数组容器
#include <queue>     // 队列容器
#include <stack>     // 栈容器
#include <set>       // 集合容器
#include <map>       // 映射容器
#include <algorithm> // 算法
#include <bitset>    // 位集容器
#include <stdio.h>   // 标准输入输出
using namespace std;
#define int long long
const int N = 1e6 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;
double a[N], b[N];
double x, y, r;
double dis(double xx, double yy) // 计算距离
{
    return sqrt(1.0 * (x - xx) * (x - xx) + (y - yy) * (y - yy));
}
double cha(double xx, double yy, double xxx, double yyy) // 计算叉积
{
    return (xx - x) * (yyy - y) - (xxx - x) * (yy - y);
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    while (cin >> x >> y >> r, r >= 0)
    {
        int n;
        cin >> n;
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            int xx, yy;
            cin >> xx >> yy;
            if (dis(xx, yy) <= r) // 将点到圆心距离小于r的点放入
            {
                a[++cnt] = xx;
                b[cnt] = yy;
            }
        }
        int max1 = 0;
        for (int i = 1; i <= cnt; i++) // 枚举每一个点在半圆的直径上,计算其左侧的点
        {
            int s = 0;
            for (int j = 1; j <= cnt; j++)
            {
                if (cha(a[i], b[i], a[j], b[j]) >= 0) // 如果叉积大于0,说明在左侧,等于0,则在直径上,都符合条件
                {
                    s++;
                }
            }
            max1 = max(max1, s); // 记录最大的左侧点数
        }
        cout << max1 << "\n";
    }

    return 0;
}

二.TOYS

将一个纸板分成了n+1个部分,因为每个分割点的坐标x是递减的,所以可以想到二分,而每个部分则是由分割线右边的那块地方包含的,所以要判断每个点落在哪个部分,就是不断二分判断对于那个部分,点和分割线的叉积是否小于0。

点击查看代码
#include <iostream>  // 输入输出流
#include <iomanip>   // 输入输出格式控制
#include <fstream>   // 文件输入输出流
#include <sstream>   // 字符串输入输出流
#include <cmath>     // 数学函数
#include <string>    // 字符串操作
#include <vector>    // 动态数组容器
#include <queue>     // 队列容器
#include <stack>     // 栈容器
#include <set>       // 集合容器
#include <map>       // 映射容器
#include <algorithm> // 算法
#include <bitset>    // 位集容器
#include <stdio.h>   // 标准输入输出
#include <cstring>
using namespace std;
const int N = 100010, M = 20;
#define int long long
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;
int x, y, n, m, x1, y3;
struct vv
{
    int x, y;
} a[N], b[N], p;
int cha(int mid)
{
    return ((a[mid].x - b[mid].x) * (p.y - b[mid].y)) - (a[mid].y - b[mid].y) * (p.x - b[mid].x);
}
int s[N];
int find() // 二分查找对于每个部分的叉积是否小于0
{
    int l = 1, r = n + 1;
    while (l <= r)
    {
        int mid = (l + r + 1) / 2;
        if (cha(mid) <= 0)
        {
            l = mid + 1;
        }
        else
        {
            r = mid - 1;
        }
    }
    return r;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    while (cin >> n, n)
    {
        cin >> m >> x >> y >> x1 >> y3;
        int cnt = 1;
        a[1].x = x, a[1].y = y, b[1].x = x, b[1].y = y3; // 先将盒子的起点的两端点记录数组
        for (int i = 2; i <= n + 1; i++)
        {
            int l, r;
            cin >> l >> r;
            a[i].x = l;
            a[i].y = y;
            b[i].x = r;
            b[i].y = y3;
        }
        memset(s, 0, sizeof(s));
        while (m--) // 对于每个玩具,find找出其所在的部分,然后加1,找出最大值。
        {
            cin >> p.x >> p.y;
            s[find()]++;
        }
        for (int i = 1; i <= n + 1; i++)
        {
            cout << i - 1 << ": " << s[i] << endl;
        }
        cout << "\n";
    }
    return 0;
}

标签:容器,int,double,输入输出,叉积,include
From: https://www.cnblogs.com/tzstlove/p/18540516

相关文章

  • 叉积法判断三点共线+重载运算符
    https://ac.nowcoder.com/acm/contest/92687/G#include<bits/stdc++.h>#defineendl'\n'#defineintlonglong#definelowbit(x)(x&-x)usingnamespacestd;constdoublepi=acos(-1);typedefpair<int,int>pii;piioperator-(piia,......
  • 点积、内积、外积、叉积、张量积——概念区分
    找张量积概念的时候,被各种野路子博客引入的各种“积”搞混了,下面仅以Wikipedia为标准记录各种积的概念。点积(Dotproduct)https://en.wikipedia.org/wiki/Dot_product在数学中,点积(Dotproduct)或标量积(scalarproduct)是一种代数运算,它取两个相等长度的数字序列(通常是坐标......
  • 向量点积dot,叉积cross product
    点积概括地说,向量的内积(点乘/数量积)。对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量(数量而不是向量)点积(点乘)的几何意义包括:表征或计算两个向量之间的夹角b向量在a向量方向上的投影叉积两个向量的外积,又叫叉乘、叉积向量积,其运......
  • 点积、内积、外积、叉积、张量积——概念区分
    找张量积概念的时候,被各种野路子博客引入的各种“积”搞混了,下面仅以Wikipedia为标准记录各种积的概念。点积(Dotproduct)https://en.wikipedia.org/wiki/Dot_pro......
  • 矢量叉积判断顺时针还是逆时针
    利用矢量叉积判断是逆时针还是顺时针。设A(x1,y1),B(x2,y2),C(x3,y3),则三角形两边的矢量分别是:AB=(x2-x1,y2-y1),AC=(x3-x1,y3-y1)则AB和AC的叉积为:(2*2的行......
  • 向量叉积判断三角形是否进行了三维旋转
    2023牛客寒假算法一E叉积判断三维旋转鸡在玩铁丝。具体来说,二维平面上有一根L型的铁丝,由AB和BC两条线段组成,鸡可以用以下三种操作玩铁丝:1、在平面内任意地平移铁丝,即......
  • 求面积 (坐标叉积公式+凹多边形面积-坐标公式)
    求面积(AREA)给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一......
  • 转:点积和叉积的数学公式
    线性代数笔记3——向量2(点积) 线性代数笔记4——向量3(叉积) ......