7月 18, 2008

【解題】Jolly Jumpers

@
ACM Volume C 10038 - Jolly Jumpers


The Problem

A sequence of n > 0 integers is called a jolly jumper if the absolute values of the difference between successive elements take on all the values 1 through n-1. For instance,

1 4 2 3

is a jolly jumper, because the absolutes differences are 3, 2, and 1 respectively. The definition implies that any sequence of a single integer is a jolly jumper. You are to write a program to determine whether or not each of a number of sequences is a jolly jumper.


The Input

Each line of input contains an integer n <= 3000 followed by n integers representing the sequence.


The Output

For each line of input, generate a line of output saying "Jolly" or "Not jolly".


Sample Input

4 1 4 2 3
5 1 4 2 -1 6


Sample Output

Jolly
Not jolly


解題思考

  在這一題,若是輸入大小為 n,我們需要先初始化一個大小同樣為 n 的布林(boolean)陣列為非(false)。

  接著,在輸入每一個數字之後,我們需要將相鄰兩數相減。若是兩數相減之絕對值落在 1 到 n - 1,就將相對應的布林陣列元素設為真(true)。

  此外,因為題目要求的是:相鄰兩數其差的絕對值恰好為 1 到 n - 1,所以若是其對應的布林陣列元素早已為真,就代表其差的絕對值有重複,也就不能達到題目所求的「恰好為 1 到 n - 1」。換句話說,碰上這種情況,就代表 Not jolly 了。為了快速起見,就可以不用再做接下來的判斷。


參考解答(C++)

#include <iostream>

using namespace std;

int main(void)
{
    int n;
    while (cin >> n)
    {
        int *num = new int[n];
        bool *seen = new bool[n];
        bool jolly = true;

        for (int i = 0; i < n; i++)
        {
            seen[i] = false;
        }

        for (int i = 0; i < n; i++)
        {
            cin >> num[i];

            if (i && jolly)
            {
                int r = num[i] - num[i - 1];

                if (r < 0) { r *= -1; }

                if (r > n - 1 || !r || seen[r])
                {
                    jolly = false;
                }
                else { seen[r] = true; }
            }
        }

        if (jolly)  { cout << "Jolly" << endl; }
        else        { cout << "Not jolly" << endl; }

        delete [] num;
        delete [] seen;
    }

#ifndef ONLINE_JUDGE
    system("pause");
#endif
}

2 回覆:

匿名 提到...

不好意思..我是初學者
可以解釋一下,下方的意思嗎?尤其是符號*的部分
int *num = new int[n];
bool *seen = new bool[n];
因為如果用陣列char num[100]; 去處理..
像題目的-1部分就會產生問題..
而int *num = new int[n];是代表把陣列儲存成int的意思嗎?

Unknown 提到...

不好意思,我不太理解您所謂「-1 發生問題」的意思。

不過我可以先解釋一下 int *num = new int[n]; 的意思。
這裡的 int *num 代表我宣告一個指向 int 變數的指標(pointer)。
而後面的 new int[n] 代表我要動態配置一塊具有 n 個 int 型態變數的記憶體空間。
所以整行的意義,就是宣告一個名為 num 的 int 指標,指向一個動態配置的 int 陣列開頭。

如果這個部份不懂,你可能需要去查看網路或書籍。
尋找有關「動態記憶體配置(Dynamical Memory Allocation)」的部分。

張貼留言