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