題目 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
之外最小的數作爲首位,然後按從0
到9
輸出所有對應數字即爲組合的最小數。 -
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;
}
小結
- 映射數組需要注意設置數組大小的問題
- 需要注意變量類型的問題(
double
orint
)