Skip to content

14208: 【原4208】氪金陷阱

题目

题目描述

author: 泰玛什 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4208

Background

小L是一个手游玩家,他在玩游戏的时候经常会忍不住氪金。

Description

为了简单起见,我们将小L的游戏世界简化成一个无限大的棋盘。每天在他打游戏的过程被看作是从位置\((x_1; y_1)\)走到\((x_2; y_2)\)。同时在每个位置,他都可以向上下左右四个方向移动。

在这个棋盘上,有些位置被游戏厂商设计了氪金陷阱,当他走到这个位置,就会忍不住剁手。

对于一个位置\((x; y)\),若以下至少有一点满足,那么该位置便是一个氪金陷阱:

  • 若\(|x+y| \equiv 0 \quad (\mod 2a)\),此处会有商店打折活动。
  • 若\(|x-y| \equiv 0 \quad (\mod 2b)\),此处会有限定皮肤活动。

这个月活动太多,为了让他月底不吃土,你需要告诉他从\((x_1; y_1)\)走到\((x_2; y_2)\)至少会经过多少氪金陷阱。

Input Format

第一行一个整数n,表示数据组数。

接下来n行,每行6个整数\(a,b,x_1,y_1,x_2,y_2\),含义如上所述。

Output Format

一共n行,每行一个数,表示从\((x_1; y_1)\) 走到\((x_2; y_2)\),最少会遇到多少个氪金陷阱。

Sample Input

1
2 4 3 -1 3 7

Sample Output

2

Limits

  • 对于前30%的数据, \(|x_1| = |y_1|\)
  • 对于前60%的数据, \(|x_1|, |y_1|, |x_2|, |y_2| \leq 10^3\)
  • 对于100%的数据, \(2\leq a, b \leq 10^9\) 且 \(|x_1|, |y_1|, |x_2|, |y_2| \leq 10^9\) \(1\leq n \leq10\),同时数据保证\((x_1; y_1)\)和\((x_2; y_2)\)均不是氪金陷阱。

Hint

一条可能的移动路径是(3;-1)->(3;0)->(3;1)->(3;2)->(4;2)->(4;3)->(4;4)->(4;5)->(4;6)->(4;7)->(3;7),其中(3;1)和(4;4)是氪金陷阱。

Hint 2

适度氪金益脑,过度氪金伤身

ligongzzz's solution

#include "iostream"
#include "cstdio"
#include "cmath"
using namespace std;

int main() {
    int n;
    cin >> n;

    for (; n > 0; --n) {
        int a, b, x1, y1, x2, y2;
        scanf("%d %d %d %d %d %d", &b, &a, &x1, &y1, &x2, &y2);
        a *= 2, b *= 2;
        int m1 = floor(double(x1 - y1) / a), n1 = floor(double(x1 + y1) / b),
            m2 = floor(double(x2 - y2) / a), n2 = floor(double(x2 + y2) / b);
        if (abs(m1 - m2) > abs(n1 - n2)) {
            printf("%d\n", abs(m1 - m2));
        }
        else {
            printf("%d\n", abs(n1 - n2));
        }
    }

    return 0;
}

q4x3's solution

/**
 * 数学题
 * 横线竖线中较多的那一个
 **/
#include <iostream>
#include <stdio.h>

using namespace std;

int main() {
    int n, a, b, x1, y1, x2, y2, tmp1, tmp2, tmp3, tmp4;
    cin >> n;
    for(int i = 0;i < n;++ i) {
        cin >> a >> b >> x1 >> y1 >> x2 >> y2;
        tmp1 = (x1 - y1) / (2 * b);
        tmp2 = (x2 - y2) / (2 * b);
        tmp3 = (x1 + y1) / (2 * a);
        tmp4 = (x2 + y2) / (2 * a);
        if(x1 - y1 < 0) -- tmp1;
        if(x2 - y2 < 0) -- tmp2;
        if(x1 + y1 < 0) -- tmp3;
        if(x2 + y2 < 0) -- tmp4;
        if(abs(tmp1 - tmp2) > abs(tmp3 - tmp4)) cout << abs(tmp1 - tmp2) << endl;
        else cout <<  abs(tmp3 - tmp4) << endl;
    }
}

skyzh's solution

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a, b, x1, y1, x2, y2;
    int T;
    cin >> T;
    for (int i = 0; i < T; i++) {
        cin >> a >> b >> x1 >> y1 >> x2 >> y2;

        double resL = floor((x1 + y1) / a / 2.0) - floor((x2 + y2) / a / 2.0);
        double resR = floor((x1 - y1) / b / 2.0) - floor((x2 - y2) / b / 2.0);
        cout << (int)round(max(fabs(resL), fabs(resR))) << endl;
    }
    return 0;
}

victrid's solution

#include <cmath>
#include <iostream>
using namespace std;

int main() {
    long long n, a, b, x1, y1, x2, y2;
    cin >> n;
    while (n--) {
        cin >> a >> b >> x1 >> y1 >> x2 >> y2;
        cout << (long long)max(abs(floor((x1 + y1) / (double)(2 * a)) - floor((x2 + y2) / (double(2 * a)))), abs(floor((x1 - y1) / (double)(2 * b)) - floor((x2 - y2) / (double(2 * b))))) << endl;
    }
    return 0;
}