2017/3/29

10038 - Jolly Jumpers

/*
482 - Permutation Arrays http://bit.ly/2o2i80g
10038 - Jolly Jumpers http://bit.ly/2mMH3Fn
 */
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    int N=4;
    while (cin>>N){
        int s[3001],check[3001]={0};
        bool ok=1;
        cin>>s[0];
        for (int i=1 ; i<N ; i++) {
            cin>>s[i];
            int temp = abs(s[i]-s[i-1]);
            if (temp <= 3000) {
                check[temp] = check[temp] +1;
            }
        }
        for (int i=1;i<N;i++){
            cout<<check[i];//0120,check[0]=0,check[1]=0,check[2]=1,check[3]=2,check[4]=0
            if (check[i]==0) { 
                ok = 0; 
                break; 
            }
            //cout<<check[i];//i從0開始到N,印出0111
        }
        if (ok) cout<<"Jolly\n";
        else cout<<"Not jolly\n";
    }//while結尾
    return 0;
}
題目網址:http://bit.ly/2mMH3Fn
這題不難,只是要知道切入點。
設輸入測資為4 1 4 2 3,輸出Jolly
第一個for迴圈做的事是,找到相鄰兩數的絕對值,並把絕對值當索引,並且+1
1、4的絕對值是3
4、2的絕對值是2
2、3的絕對值是1
每次把它們放到temp暫存,且必定小於3000,
最後check[3]、check[2]、check[1]的值都等於1

第二個for迴圈,走訪check[1~N-1],只要其中一個值是0,就是Not jolly
很顯然,check[1~4-1]沒有一個是0,所以印出Jolly

歸納一些解題想法:
1.需仔細觀察會Jolly和Not jolly與測資的情況。
2.藉由測資特性去思考,通常會Jolly的,每個相鄰兩數的絕對值,一定是有順序性且不重複,藉由這特性把絕對值當索引,存入一次記錄為1。而Not jolly,通常絕對值會跳很大,或都相等,如1 3 5 7,會變成每次都把同一個索引+1,其他索引都是0,必定就產生0,就一定是Not jolly。

沒有留言:

張貼留言