/*
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。
沒有留言:
張貼留言