ZeroJudge I859: Can You Solve It?

同題:UVa 10642 – Can You Solve It?

下面這張圖,每個圓都有一個坐標,根據笛卡爾坐標系,您可以按照以下所示的箭頭路徑從一個圓圈移動到另一個圓圈。

total_number_of_step(s)_needed = number_of_intermediate_circles_you_pass + 1

例如,要從 (0, 3) 到 (3, 0),您必須經過兩個中間圓 (1, 2) 和 (2, 1)。 所以,在這種情況下,所需的總步數是 2 + 1 = 3。

ZeroJudge I859 題目敘述用圖

範例測資

範例輸入範例輸出
第一行為一個整數 N 代表測試資料數量
接下來 N 行,每行包含 4 個整數 x1、y1、x2、y2 (0 ≤ x1, y1, x2, y2 ≤ 100000)
(x1, y1) 代表起始座標
(x2, y2) 代表目標座標
對於每筆測試資料,請照格式輸出是第幾筆
以及要花費的最小步數
3
0 0 0 1
0 0 1 0
0 0 0 2
Case 1: 1
Case 2: 2
Case 3: 3

解題思路

如果把步數標出來的話,可以發現 Y 軸 (橫軸) 的步數是 0 –> 1 –> 3 –> 5 –> 9,以此類推。舉例來說,當 x + y 等於 2 的時候,可以發現這些點都落在 (0, 2) 這個點的斜線上,更可以發現 (1, 1) 這個點是 (0, 2) 的步數+1,也就是其x座標。同理,(2, 0) 的步數就是 (0, 2) 的步數+2。

ZeroJudge I859 解題思路解說用圖

可以先設定一個陣列,並將 0、1、3、6、10...等數字存放到 Y 座標 (橫軸) 的位置上。收資料的時候判斷 x + y 是多少就找這個位置的步數然後加上x座標的值。

範例程式碼-ZeroJudge I859: Can You Solve It?

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

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    vector<long long int>Chueh;
    long long int count = 0, add = 0;
    for (int i = 0; i<=200000; i++)
    {
        count += add;
        Chueh.push_back(count);
        add++;
    }
    int N;
    cin >> N;
    for (int i = 0; i<N; i++)
    {
        long long int a, b;
        cin >> a >> b;
        long long int start = Chueh[a+b] + a;
        cin >> a >> b;
        long long int finish = Chueh[a+b] + a;
        cout << "Case " << i+1 << ": " << finish-start << "\n";
    }
}

//ZeroJudge I859
//Dr. SeanXD

發佈留言