2017年6月12日 星期一

CPE 015 UVa10038-Jolly Jumpers


題目原文
題目內容
有n個整數的序列我們稱為jolly jumper,如果相鄰的2個數其差的絕對值恰好為1到n-1。例如:
1 4 2 3
就是jolly jumper(n=4)。因為相鄰2數的差的絕對值為3,2,1,就是1到n-1。但是
1 4 2 -1 6 
不是jolly jumper(n=5)。因為相鄰2數的差的絕對值為3,2,3,7,並非1到n-1。

你的任務是寫一個程式來判斷一個整數序列是否為jolly jumper。


輸入說明:
每組測試資料一列,第一個正整數為 n(n < 3000),代表此整數序列的長度。接下來有n個整數,代表此整數序列。請參考Sample Input。

輸出說明:
對每一組測試資料,輸出此整數序列是否為jolly jumper。請參考Sample Output。

Sample Input

4 1 4 2 3
5 1 4 2 -1 6
Sample Output

Jolly
Not jolly
解法
一. 1 2 4 為Jolly, 因為其差值為1 2。 (差值1~(n-1[=2])皆有)
二. 1 3 4 為Jolly, 因為其差值為2 1。 (差值1~(n-1[=2])皆有)
三. 1 2 3 為Not Jolly,因為其差值為1 1。(差值1~(n-1[=2])並非都有,僅只有1而已)
簡單來說就是兩兩相差的值,是要介於1~(n-1)之間且相差的值不可於重複又或者是說倆倆相差的值剛好要等於1、2,3~(n-1)這個數列裡面每一個值都要剛好有。


(以上資料來源:大學程式能力檢定Collegiate Programming Examination(CPE)、中文翻譯來源:Lucky 貓)




程式碼解答







#include <stdio.h>///基本的函式庫
#include <stdlib.h>///因為會使用到絕對值abs所以需要導入這函式庫
#define MAX 3001
int main()
{
 int n;///存放第一個的值
 while(scanf("%d", &n)!=EOF)
 {
  int key=1;///用來判斷要印Jolly還是Not jolly用的
  int data, lastdata;
  int check[MAX]={0};///判斷有沒有重複的值所以啟始要先歸零不然會被帶入垃圾值
  for(int i=0; i<n; i++)
  {
   scanf("%d", &data);///一筆一筆讀來一筆一筆比較
   if(i&&key)///倆倆的相差運算和判斷jolly跟Not jolly的地方
   {
    int temp=abs(data-lastdata);
    
     if(temp<1 || temp>n-1 || check[temp]>0)///檢查相差值是否介於1~n-1跟有沒有重複
      key=0;
    
    check[temp]++;///開櫃子的概念
   }
   
   lastdata=data;
   
   
  }
  printf("%s\n", key? "Jolly" : "Not jolly");///答案列印
 
 
 }

}





程式碼打包:解法一

沒有留言:

張貼留言