• UPC GCPC2019 K: Move & Meet


    题意:两个人在一个无限的棋盘上玩.每个人都有个初始位置,它们都要走特定的步数.求可以走到的相同位置.如果不存在这个位置,则输出"impossible".

    输入:给定两行(x, y(-10^{12} <= x, y <= 10^{12})和d(0 <= d <= 10^{12})).d表示要走的特定步数.

    分析:先交换y1, y2(如果y1 < y2),这样y1就在y2上面,那么我们的x1和x2就只存在两种情况,x1 < x2或者x1 > x2,我们只需要判断这两种情况即可.

    首先是求出两个点之间的曼哈顿距离,即dist = abs(x1 - x2) + abs(y1 - y2),然后比较d1 + d2和dist的大小,如果dist > d1 + d2,说明不存在合法的点使得两个人走在一起,其次是如果d1 + d2 - dist多出来的步伐是一个玩家要左右横跳的次数,这个次数要% 2 == 0.然后我们需要找出能够到达的合法的点,对于c = d1 + d2 - dist,这个c我们要消耗掉,让两个玩家分担,需要注意的是,分担的时候必须偶数偶数的分担,这样才能反复横跳.

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    using ll = long long;
    int main()
    {
    
            ll x1, y1, d1, x2, y2, d2;
            int t;
            while (cin >> x1 >> y1 >> d1 >> x2 >> y2 >> d2)
            {
                ll dist = abs(x1 - x2) + abs(y1 - y2);
    
                ll c = (d1 + d2) - dist;
    
                if (c < 0 || c % 2)
                    puts("impossible");
                else
                {
                    if (y1 < y2)
                    {
                        swap(x1, x2);
                        swap(y1, y2);
                        swap(d1, d2);
                    }
                    if (x1 <= x2 && y1 >= y2)
                    {
                        ll q = min(d1, c);
                        if (q == d1)
                        {
                            if (d1 & 1) d1 = 1;
                            else d1 = 0;
                            d2 = d2 - (c - d1);
                        }
                        else d1 = d1 - c;
                        ll dist = abs(x2 - x1);
                        ll q2 = min(dist, d1);
                        if (q2 == d1) cout << x1 + d1 << " " << y1 << endl;
                        else cout << x2 << " " << y1 - (d1 - dist) << endl;
                    }
                    else if (x1 >= x2 && y1 >= y2)
                    {
                        ll q = min(d1, c);
                        if (q == d1)
                        {
                            if (d1 & 1) d1 = 1;
                            else d1 = 0;
                            d2 = d2 - (c - d1);
                        }
                        else d1 = d1 - c;
                        ll dist = abs(x2 - x1);
                        ll q2 = min(dist, d1);
                        if (q2 == d1) cout << x1 - d1 << " " << y1 << endl;
                        else cout << x2 << " " << y1 - (d1 - dist) << endl;
                    }
                }
            }        
        return 0;
    }
    
  • 相关阅读:
    后端指路手册(建议收藏):一文告诉你后端都要学习什么?应该从哪里学起!
    《Java 编程思想四》最新中文版,附下载地址!
    大厂面试必问的 4 大开源框架,你真的就懂了吗?
    借花献佛!朋友干了5年整的Java面试官,给我分享了一份面试官最爱问的Java面试题
    字节跳动总结的设计模式 PDF 火了,完整版开放下载!
    java
    java
    java
    java
    关于public class
  • 原文地址:https://www.cnblogs.com/pixel-Teee/p/13746201.html
Copyright © 2020-2023  润新知