若有更好的錯誤請指證,若有更好的想法希望可以不吝嗇的分享,感謝
另外感謝Lucky貓的 UVA(ACM)園地的翻譯

問題

uva 10038英文題目
uva 10038中文題目

思路

題目的意思其實是要表達1~n個數裡,所有兩個數之間的差值要有1~n-1,那就是jolly.
所以可以用一個長度為n的array紀錄1~n-1是否都存在(為了方便array[0]則捨棄不用)

version1

仔細思考可得以下幾點:

  1. 若兩數差值為k, k > length(array)-1則 not jolly (根據上述只記錄1~n-1的值所以不能大於n-1)

  2. 記錄完所有兩數差值之後,檢查1~n-1的值皆存在則為jolly

#include <iostream>
#include <cmath>

using namespace std;
bool check(int *nums,bool *record,int length){
    
    for(int i = 1 ; i < length ; i++){
        int temp = abs(nums[i] - nums[i-1]);
        if(temp > length - 1)
            return false;
        record[temp] = true;
    }
    
    for(int i = 1 ; i < length ; i++){
        if(!record[i])
            return false;
    }
    return true;

}

int main(){
    int length;
    while(cin >> length){
        int nums[3001] = {0};
        bool record[3001]= {false};
        
        for(int i = 0 ; i < length ; i++){
            cin >> nums[i];
        }
        
        if(check(nums,record,length))
            cout << "Jolly" << endl;
        else
            cout << "Not jolly" << endl;
        
    }
 }

version2

另一種解法一樣是使用表格記錄,只是用了不同的判斷方式:

  1. 在記錄兩數差值k的時候,順便去看表格,如果k本來已經存在,則為not jolly (因為有n個數)

  2. 若兩數的差值k, k = 0k > length - 1 則 not jolly.

  3. 若不為not jolly,則為 jolly

bool check(int *nums,bool *record,int length){
    
    for(int i = 1 ; i < length ; i++){
        int temp = abs(nums[i] - nums[i-1]);
        if(temp > length - 1 || temp == 0 || record[temp])
            return false;
        record[temp] = true;
    }
    return true;
}

Reference

  1. Programming學習筆記

  2. Lucky貓的 UVA(ACM)園地

  3. 翼世界夢想領域


as23041248
4 声望1 粉丝

台灣某大學生