iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 2

Day 0x2 UVa11150 Cola

題意

  • 3瓶可樂換一瓶,可和朋友借一瓶 (需還),問買 N 瓶共能喝到多少瓶?

    題目故意講了兩種方法超混亂,但其實就是問第二種換法而已 ==

  • 需要注意的有:
    1. 重複輸入
    2. 每行輸入一整數

解法

  • 既是重複輸入,又沒給測資數,潛規則就是 EOF
  • 輸入的數不大,用 int 即可
  • 一開始買多少 = 喝多少,又喝多少便產生多少空瓶,所以 Coke_sum & Coke_empty 初始化為輸入數
    while(scanf("%d", &Coke) != EOF){
            Coke_sum = Coke;
            Coke_empty = Coke;
    }
    
  • 只要空瓶大於等於 3 即可兌換可樂,用迴圈重複檢查,疊加喝掉的瓶數 空瓶 / 3 = 兌換量,且兌換多少即產生多少空瓶,加上沒兌換到的空瓶,更新空瓶為 空瓶 / 3 + 空瓶 % 3
    while(Coke_empty >= 3){
        Coke_sum = Coke_sum + (Coke_empty / 3);
        Coke_empty = (Coke_empty / 3) + (Coke_empty % 3);
    }
    
  • 跳出迴圈後即可輸出結果,但因為若空瓶為 2,可和朋友借一空瓶湊成 3 瓶去兌換,喝完再歸還空瓶。可透過偉大且神奇的除法來達成這項檢查
    // 意同:
    // Coke_sum = (Coke_empty == 2) ? Coke_sum + 1 : Coke_sum;
    // printf("%d\n", Coke_sum);
    printf("%d\n", Coke_sum + Coke_empty / 2);
    
  • C Code ver. 1
#include<stdio.h>

int main(){

    int Coke;
    int Coke_sum;
    int Coke_empty;

    while(scanf("%d", &Coke) != EOF){

        Coke_sum = Coke;
        Coke_empty = Coke;

        while(Coke_empty >= 3){
            Coke_sum = Coke_sum + (Coke_empty / 3);
            Coke_empty = (Coke_empty / 3) + (Coke_empty % 3);
        }

        printf("%d\n", Coke_sum + Coke_empty / 2);
    }

    return 0;
}

公式解

  • 世界真神奇之妙妙公式解

  • 因為題目只有說可借,沒規定何時借 & 借多少,透過借空瓶的漏洞,就能不要臉多借一點!
    一開始購買後,將可樂分成兩兩一組,每組各借一個空瓶,全部喝完 + 兌換後便歸還剩餘空瓶數

    ◆:滿瓶 ◇:空瓶,以 N = 8 為例:

    購買:◆◆◆◆◆◆◆◆
    分組:◆◆ ◆◆ ◆◆ ◆◆
    借瓶:◆◆◇ ◆◆◇ ◆◆◇ ◆◆◇
    喝掉:◇◇◇ ◇◇◇ ◇◇◇ ◇◇◇
    兌換:◆ ◆ ◆ ◆
    喝掉:◇ ◇ ◇ ◇
    歸還:

  • 用結論來解釋
    喝掉 = 購入 × 1.5
    簡單地展開後
    喝掉 = 購入 + 購入 ÷ 2
    購入:就是一開始輸入的購買可樂數,同上所述,購買便喝掉
    購入 ÷ 2:兩瓶一組,共多少組

  • C Code ver. 2

#include<stdio.h>

int main(){

    int n;

    while(scanf("%d", &n) != EOF){
        printf("%d\n", n * 3 / 2);
    }

    return 0;
}

上一篇
Day 0x1 Intro & UVa10055 Hashmat the Brave Warrior
下一篇
Day 0x3 UVa10222 Decode the Mad man
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言