2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)

题目如下:

2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)_第1张图片

示例1

输入
1 0 0 1

输出

0 0

说明

输出1 1也是可以的。

思路 or 题解:

我们可以迅速找到 C C C 有两个位置满足题意,但 C C C 的坐标不一定是整数,我们需要 c h e c k check check
2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)_第2张图片
M M M A B AB AB 的中点
我们可以求出来 A M → \overrightarrow{AM} AM , M C 1 → \overrightarrow{MC_1} MC1 , M C 2 → \overrightarrow{MC_2} MC2
通过向量我们可以求出 C 1 , C 2 C_1, C_2 C1,C2 的坐标,最后 c h e c k check check 一下就行了

注意:

为了在计算中不出现分数,我们可以把坐标均乘以 2 2 2, 最后答案坐标 除以 2 2 2 即可。

AC 代码如下:

/*
Make it simple and keep self stupid
author:Joanh_Lan
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define buff                     \
    ios::sync_with_stdio(false); \
    cin.tie(0);
#define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
//int Mod(int a,int mod){return (a%mod+mod)%mod;}
//int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
//int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
//int inv(int a,int mod){return qmi(a,mod-2,mod);}
//int lcm(int a,int b){return a*b/__gcd(a,b);}
void solve()
{
    int x1, x2, y1, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    x1 *= 2, x2 *= 2, y1 *= 2, y2 *= 2;
    int mx = (x1 + x2) / 2ll, my = (y1 + y2) / 2ll;
    int detla_x = mx - x1, detla_y = my - y1;
    if ((detla_y + mx) % 2ll == 0 && (-detla_x + my) % 2ll == 0)
        cout << (detla_y + mx) / 2ll << ' ' << (-detla_x + my) / 2ll << '\n';
    else if((-detla_y + mx) == 0 && (detla_x + my) % 2 == 0)
        cout << (-detla_y + mx) / 2ll << ' ' << (detla_x + my) / 2ll << '\n';
    else
        cout << "No Answer!\n";
}
signed main()
{
    buff;
    solve();
}

你可能感兴趣的:(练习,算法,c++,数学,牛客)