斜めのウォーキングV.2のCodeForces - 1036B(思考、貪欲)

斜めのウォーキングV.2

CodeForces - 1036B

ミハイルは、デカルト平面上を歩きます。彼はポイント(0,0)、(0,0)から始まり、一手に彼は8つの隣接点のいずれかに行くことができます。例えば、ミハイルはポイント(0,0)、(0,0)で、現在であれば、彼が一手で、以下の点のいずれかに行くことができます:

  • (1,0)(1,0)。
  • (1,1)(1,1)。
  • (0,1)(0,1)。
  • (-1,1)、( - 1,1)。
  • (-1,0)、( - 1,0)。
  • (-1、-1)( - 1、-1)。
  • (0、-1)、(0、-1);
  • (1、-1)、(1、-1)。

ミハイル・ポイント(X1、Y1)(X1、Y1)からのポイントになると(X2、Y2)(x2、y2)が一手で、かつX1≠x2x1≠X2およびY1≠y2y1≠Y2、そのような動き斜めの動きと呼ばれています。

ミハイルは、QQのクエリを持っています。II番目のクエリの場合ミハイルの目標は正確に動くキキのポイント(0,0)、(0,0)から点(NI、MI)(NI、MI)に行くことです。すべての可能な動きの中で彼は、対角線移動の最大数のいずれかを選択します。あなたの仕事は、斜めの動きの最大数を見つけたり、キキが動くのポイント(NI、MI)(NI、MI)をポイント(0,0)、(0,0)から行くことは不可能であることを見つけることです。

ミハイルは、任意の回数(でも、先のポイント!)任意のポイントを訪問することに注意してください。

入力

クエリの数 - 入力の最初の行は1つの整数QQ(1≤q≤1041≤q≤104)を含みます。

その後、QQの行が続きます。、クエリの目的地点のX-X座標YY座標 - これらQQ線の二番目は、三つの整数ニニ、ミミとキキ(1≤ni、MI、ki≤10181≤ni、MI、ki≤1018)が含まれ対応して、クエリとクエリ内の移動の数の目的地点の。

出力

プリントQQの整数。ミハイルは、上述した正確キキ移動で点(NI、MI)(NI、MI)の点(0,0)(0,0)から行くことができない場合II番目の整数は-1に等しくなければなりません。そうでなければ二番目の整数は、すべての可能な動きのうち、対角移動の最大数に等しくなければなりません。

入力

32 2 34 3 710 1 9

出力

16-1

注意

最初のテストケースに対する可能な回答のいずれか:(0,0)→(1,0)→(1,1)→(2,2)(0,0)→(1,0)→(1,1 )→(2,2)。

第二のテストケースに対する可能な回答のいずれか:(0,0)→(0,1)→(1,2)→(0,3)→(1,4)→(2,3)→(3、 2)→(4,3)(0,0)→(0,1)→(1,2)→(0,3)→(1,4)→(2,3)→(3,2)→ (4,3)。

第3のテストケースにミハイル9回の移動で点(10,1)、(10,1)に到達することができません。

質問の意味:

AKされているゲームを防ぐために!世界の平和を守るために!私たち!愛と本当の不吉を実装!愛情と魅力的なトピックグループ!決め!zzqは、逮捕され無人島に置きます。島Chuansongジェン(N、M)を残して(0,0)、彼ちょうど十分な物理値ZZQ kのステップは離れて、8つの方向のZZQ各々を取ることができるZZQ位置。
(1,0)
(1,1)
(0,1)
(1,1)
(1,0)
(-1、-1)、
(0、-1)、
(1、-1)
が、穏やかで親切SYHどのように大きな悪魔島からの脱出を容易zzqますので、彼女はk個秒で唯一のオープンチュアンSongzhen、斜め方向にできるだけ多くをzzq期待している、パスワードは、ステップ数が斜め方向に移動するまでzzqです。
悪いzzqグラウンドホッグは、すべての脳細胞を吸引し、彼はあなたが彼が輸出液を作るためにあなたを呼び出すしたいと考えています。

アイデア:

(x、y)を交換するのx> yの場合は、XY交換は答えには影響を与えません。

次に(X、X)に行ってきました(0、0)で始まります

そして、垂直上方に行きます

私たちは、z =のKXを聞かせて、

もし道yの残り=(Y-X)

[次へ]を

y及びzは、zのいずれかで、奇数であれば1、単位Yの徒歩。

どちらもなっている、とさえ、このような動きによって、Zのすべての残りの部分を作ることができることから回復するために行かなければなりません。

それ以外の場合は、y、zの一つだけが奇数の場合、フルに行くために傾いZの一部でもして、その答えは、1を減算する必要があります。

詳細コードを参照してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int q;
ll x, y, k;
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
    scanf("%d", &q);
    while (q--)
    {
        scanf("%lld %lld %lld", &x, &y, &k);
        if (x > y)
        {
            swap(x, y);
        }
        ll z = k - x;
        y -= x;
        if (z < y)
        {
            printf("-1\n");
        } else
        {
            if (z & 1)
                x += z - 1;
            else
                x += z;
            if (y & 1)
            {
                y = 1;
            } else
            {
                y = 0;
            }
            if (z & 1)
            {
                z = 1;
            } else
            {
                z = 0;
            }
            if (z & y)
            {

            } else if (z + y)
            {
                x--;
            }
            printf("%lld\n", x );
        }
    }



    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}


おすすめ

転載: www.cnblogs.com/qieqiemin/p/11515936.html