[code] PTA 胡凡算法筆記 DAY026

題目 A1048 Find Coins

在這裏插入圖片描述

  • 題意
    給出需要的錢數和擁有的n個硬幣,然後給出是否可以由兩枚硬幣支付。可以輸出兩枚硬幣的面額,不能輸出No Solution

  • 思路
    用數組記錄對應硬幣面額的數量,這裏數組大小需要設置爲1000+,因爲面額最大爲500,然後兩枚的最大總額爲1000,在判斷過程中m-i就有可能達到999。然後在過程中一般情況判斷num[i] >=1 && num[m-i] >= 1 就可以,但是如果m == m-i的情況需要判斷num[m-i] >= 2即可。

  • Code in C++

#include <cstdio>
#define maxn 1001
int coins[maxn] = {0};

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int coin;
    for (int i = 0; i < n; ++i) {
        scanf("%d", &coin);
        ++coins[coin];
    }

    for (int i = 1; i <= 500 && m <= 1000 && i < m; ++i) {
        if (coins[i] && coins[m-i]) {
            if (m-i == i && coins[m-i] < 2) {
                continue;
            }

            printf("%d %d", i, m-i);
            return 0;
        }
    }
    printf("No Solution");
    return 0;
}


題目 B1023 組個最小數

在這裏插入圖片描述

  • 題意
    給出0-9各個數字的個數,然後輸出能組成的最小數,首位不能是零。

  • 思路
    找到除0之外最小的數作爲首位,然後按從09輸出所有對應數字即爲組合的最小數。

  • Code in C++

#include <cstdio>

int num[10];
int main()
{
    int min_num = 10;
    for (int i = 0; i <= 9; ++i) {
        scanf("%d", &num[i]);
        if (num[i] > 0 && i!= 0 && min_num > i) min_num = i;
    }
    // 輸出第一個數字
    printf("%d",min_num);
    --num[min_num];
    for (int i = 0; i <= 9; ++i) {
        for (int j = 0; j < num[i]; ++j) {
            printf("%d", i);
        }
    }
    return 0;
}


題目 B1020 月餅

在這裏插入圖片描述

  • 題意
    給出各個類別月餅的庫存,其總價值及市場需求量,輸出可以獲得的最大收益(保留兩位小數)。

  • 思路
    主要其實就是需要先賣單價高的月餅,這樣收益最高。利用結構體存儲價格,庫存,計算出其對應的單價,然後根據單價進行排序後用市場需求量去控制賣出各個類別的月餅數量,計算總額即可。
    注意: 市場需求量,庫存,價格都可能是浮點數。

  • Code in C++

#include <cstdio>
#include <algorithm>
#define maxn 1001

struct mooncake{
    double store;
    double sell;
    double price;
} mk[maxn];

bool cmp (const mooncake &a, const mooncake &b) {
    return a.price > b.price;
}

int main()
{
    int n;
    double d;
    scanf("%d %lf", &n, &d);
    for (int i = 0; i < n; ++i) {
        scanf("%lf", &mk[i].store);
    }
    for (int i = 0; i < n; ++i) {
        scanf("%lf", &mk[i].sell);
        mk[i].price = mk[i].sell / mk[i].store;
    }
    std::sort(mk, mk + n, cmp);

    double sum = 0;
    for (int i = 0; i < n; ++i) {
        if (mk[i].store >= d) {
            sum += mk[i].price * d;
            break;
        } else {
            sum += mk[i].sell;
            d -= mk[i].store;
        }
    }
    printf("%.2f", sum);
    return 0;
}


小結

  1. 映射數組需要注意設置數組大小的問題
  2. 需要注意變量類型的問題(double or int
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章