C语言中如何修正数组比较逻辑解决最大薯片购买量问题
问题背景
一家杂货店有N种不同类型的薯片,Chris希望用手中的M美元购买尽可能多的薯片,需帮忙计算他最多能买的薯片数量。
输入输出格式
- 输入格式:输入以测试用例数T开头,每个测试用例包含两个整数N和M,第二行是N个整数,表示第i种薯片的单价,每种薯片供应不限。
- 输出格式:输出以“Case #X: ”开头(X为从1开始的测试用例编号),后跟最多可购买的薯片数量。
约束条件
- 1 ≤ T ≤ 100
- 1 ≤ N ≤ 10000
- 1 ≤ M ≤ 10^9
- 单价范围为1到10^6
样例输入输出
输入
6 4 5 1 2 3 4 3 3 5 5 5 3 2 1 1 1 10 5 1 1 1 1 1 2 2 2 2 2 6 2 1 2 3 6 5 4 1 5 1
输出
Case #1: 5 Case #2: 0 Case #3: 2 Case #4: 5 Case #5: 2 Case #6: 5
我的代码与问题
#include <stdio.h> int main() { int t; scanf("%d", &t); for(int i = 1; i <= t; i++) { long long int n, m; scanf("%lld %lld", &n, &m); int chips[n]; for(int j = 0; j < n; j++) { scanf("%d", &chips[j]); } if(m > chips[n - 1]) { printf("Case #%d: %lld\n", i, m); } else if(m < chips[n - 1]) { printf("Case #%d: 0\n", i); } } return 0; }
我在if else判断部分出错,错误地将M与数组最后一个元素比较,我认为需逐个将M与数组元素比较,但不知如何编写对应语法,请求指导该问题的正确if else语句写法。
解决方案
要买到最多的薯片,核心逻辑是选择单价最低的薯片——相同预算下,单价越低能买的数量越多。不需要逐个比较M和每个元素,而是先找出数组中的最小单价,再计算数量:
- 遍历所有单价,找到其中的最小值
min_price - 如果
min_price > M,说明买不起任何薯片,输出0 - 否则,用
M / min_price得到最多能购买的数量
修改后的代码如下:
#include <stdio.h> #include <limits.h> // 用于INT_MAX初始化最小单价 int main() { int t; scanf("%d", &t); for(int i = 1; i <= t; i++) { long long int n, m; scanf("%lld %lld", &n, &m); int min_price = INT_MAX; // 初始化最小单价为整数最大值 // 读取单价的同时记录最小值,无需存储整个数组 for(int j = 0; j < n; j++) { int price; scanf("%d", &price); if(price < min_price) { min_price = price; } } long long count; if(min_price > m) { count = 0; } else { count = m / min_price; } printf("Case #%d: %lld\n", i, count); } return 0; }
代码说明
- 读取单价时直接更新最小值,无需额外存储整个数组,节省内存(尤其当N=10000时)
- 用
INT_MAX初始化最小单价,确保第一个读取的单价会替换初始值 - 用
long long存储购买数量,避免M为1e9这类大值时,除以小单价导致整数溢出
内容的提问来源于stack exchange,提问作者Darwin Leonard
相关产品推荐
相关产品推荐

