Skip to main content

【UVa】10038 - Jolly Jumpers

英文題目傳送門,中文題目傳送門

如果一串數列有n個元素,其兩兩相減產生的絕對值,可以事後由小而大排序成1~n-1的話,便稱為Jolly Jumper數列。

所以根據題目附上的範例
inputArray_1[] = 1 4 2 3
abs_of_difference[] = 3 2 1
==>Jolly

inputArray_2[] = 1 4 2 -1 6
abs_of_difference[] = 3 2 3 7
==> Not Jolly


另外要注意的是,差值的絕對值並不需要有特別的大小依序關係,只要算出來的所有的絕對值都是1~n-1範圍內唯一一個數值就可以了。
數列1 2 4為Jolly,差值的絕對值為1 2(符合1~n-1 [ = 2] 的條件)
數列1 3 4也為Jolly,差值的絕對值為2 1(符合1~n-1 [ = 2] 的條件)

解題的過程可以分成下面三個步驟
  1. 取得第一位代表共有幾位數字的數值,賦予變數inputCount
  2. 以步驟一取得的數值做為for迴圈的邊界數值,將後續數值陣列賦予inputArray
  3. #include <math.h>使用abs(),使用for迴圈輪巡過一次inputArray陣列,算出兩兩數值間差值的絕對值,這邊宣告了另一個陣列jollyArray,用來儲存已出現數值的tag,例如當絕對值算出來為3,則jollyArray[3] = 1,表示數值3已經出現過了
  4. 最後使用for迴圈輪巡jollyArray,如果發現有元素數值為0,表示該差值沒有被計算出來,不滿足題目的條件,將isJolly = 0,由isJolly來判斷並印出訊息
程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc , char *argv []){
       
    int i, inputCount = 1; 
    int inputArray[3000] = {0};
       
    while(scanf("%d", &inputCount) != EOF){
        if (inputCount == 0)
             break;
       
        for (i = 0; i < inputCount; i++){
            scanf("%d", &inputArray[i]);
         }
        
         /*
        printf("input integers:");
        for (i = 0; i < inputCount; i++){
            printf("%d ", inputArray[i]);
        }
        printf("\n");
        */
                    
         int jollyArray[3000] = {0};
        
         for (i = 1; i < inputCount; i++){
            jollyArray[abs(inputArray [i] - inputArray[i - 1])] = 1;
         }
                
         /*
        for (i = 1; i < inputCount; i++){
            printf("jollyArray[%d] = %d\n", i, jollyArray[i]);
        }
        printf("\n");
        */
        
         int isJolly = 1;
        
         for (i = 1; i < inputCount; i++){
             if (jollyArray[i] != 1){
                isJolly = 0;
                 break;
             }
         }
        
         if (isJolly == 1)
            printf("Jolly\n");
         else
            printf("Not jolly\n");
            
    }
    return 0;
}

這題主要練習的部分應該是最後的那個步驟,透過更改特定元素的數值來進行標示的手法,如果是初次看見的童鞋可能需要一點時間消化記憶一下。
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

Comments

Popular posts from this blog

淺介I2C

I 2 C 起源 內部整合電路( Inter-Integrated Circuit, I 2 C, 讀做 I-square-C )是由飛利浦半導體公司開發的一種專用介面。 I 2 C 是以最少的連接線進行硬體佈線還要有靈活擴充的特性為目標而設計,最後出現了只有以序列資料線 SDA ( Serial DAta )及序列時脈線 SCL ( Serial CLock )來進行所有通訊的 I 2 C 介面, I 2 C 允許多主( master )多僕( slave )系統,其傳輸系統內每一個裝置都有唯一的地址可供辨識。資料的寫入和讀取都是由 master 主動發起, slave 無法主動向 master 回報,除非使用中斷腳通知 master 。 I 2 C 傳輸速度有慢(小於 100Kbps )、快( 400Kbps )及高速( 3.4Mbps )三種,每一種均可向下相容。 I 2 C 電路配置 如前所述 I 2 C 為兩線式,一為時脈線 SCL ,另一條為資料線 SDA ,硬體線路如圖 1 ,兩線皆為雙向性,且都需要透過高接電阻( pull-up, 對岸說的上拉電阻)接電。平常不使用時, SCL 與 SDA 的訊號都處於高電位。為了多裝置共線的功能,裝置的 SCL 和 SDA 腳位要為 開洩極( open-drain ) 或 開集極( open-collector ) 。一旦有一個腳位的開洩極導通接地,則整條線都為低電位,這種現象稱作 wired-AND 運作 ;如同邏輯 AND 運算,需要共接的腳位都是 1 (開洩極斷路),該條線的電位才是 1 。如果沒有開洩極的腳位,可以使用具內部高接電阻的腳位,當要輸出 1 時,則設定該腳位為高接型輸入腳;而輸出為 0 時,則改設定為輸出腳並輸出 0 的值。 圖 1. I 2 C 傳輸裝置接線 [1] I 2 C 通訊協定 為使說明部分更簡潔,首先介紹幾個名詞: 位元傳輸協定 當 master 要跟 slave 溝通時,會先有個起始條件( start condition )的訊號,結束時也會送出終止條件( stop condition )訊號。起始條件訊號

【Arduino】Timers, Registers, and Fast PWM Mode

由於Arduino預設的PWM控制方法僅有500Hz(好像還有另一個),想要知道怎樣才可以調整成其他頻率,以此做記錄。 先說明Timer設定方式、PWM Mode,之後會在Arduino上實做。 如果對_BV()沒有概念,可以參考 【Arduino I/O Ports】Control under avr-libc 這篇文章。

Emart Sunny Sale: 3D Shadow QR Code

  Emart是韓國連鎖超市,近期他們發現中午12:00到下午1:00的銷售量會明顯減少,為了提高銷售量他們製作出了帶有日晷概念的3D QR code。