打酱油 Java算法

最近在练习CCF模拟题,写一些题目的个人算法.
题目描述
首先来分析以下这道题目:
要求是给出能够购买的最大酱油瓶数,可以购买的规格有三种,分别是:
1.一次购买1瓶,需要10元
2.一次购买3瓶送1瓶,相当于4瓶,需要30元
3.一次购买5瓶送2瓶,相当于7瓶,需要50元
根据这三种买法发现,第三种买5送2是最经济的,也就是money足够的时候,优先用这种方式购买,其次选择买3送1的买法,最后选择单买.
已经分析出怎样购买能得到最多的酱油,就可以开始写代码了
思路:
1.不用去思考初始的money(即N)是多少,只需要按照我们的购买顺序计算即可;
2.首先假设能够购买 n1份 5瓶的套餐,那么 n1=N/50; 现在就有了 7*n1 瓶酱油(因为买5送2嘛,一份里面就有7瓶)
其次,买完了 n1份 5瓶套餐后,剩下的money为: m1=N%50; 现在用剩下的money购买 n2份 3瓶的套餐, 那么 n2=m1/30; 现在就有了 4*n2 + 7 *n1 瓶酱油(原理同上)
3.买完了两种套餐,现在的money只剩下: m2=m1%30; 只能一瓶一瓶的购买,即: n3=m2/10;最终,我们能得到的最大瓶数为: n3 + 4*n2 + 7 *n1
4.你问我如果N给的不能整除呢? 别担心,因为题目说了,测试数据N是10的整数倍

最后就是用代码实现啦! (Java)
如下:
(N记录初始money, n1,n2,n3分别记录每种购买方式的份数, m1,m2记录每次购买完后剩余的money)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = 0, n1 = 0, n2 = 0, n3 = 0, m1 = 0, m2 = 0;
        N = sc.nextInt();
        n1 = N / 50;
        m1 = N % 50;
        n2 = m1 / 30;
        m2 = m1 % 30;
        n3 = m2 / 10;
        System.out.println(7*n1 + 4*n2 + n3);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题是一道典型的贪心算法题目。 题目描述:有一个容量为 n 的油桶,每卖一瓶酱油就能得到一块钱,每卖出一瓶酱油后,油桶的容量就会减少 1。现在有m瓶酱油,每瓶需要占用 ai 的容量,问最多能得到多少钱。 算法思路:首先,需要将酱油按照占用容量从小到大排序。然后,从第一瓶酱油开始卖,每次卖出一瓶酱油后,将当前油桶的容量减去该瓶酱油所占用的容量。如果当前油桶的容量小于 0,则说明无法再卖出酱油,此时需要结束卖酱油的过程。最后,将卖出的酱油数量乘以单价即为最终的收益。 具体实现方式如下: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100000 int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; } int main() { int n, m; scanf("%d%d", &n, &m); int a[MAX_N]; for (int i = 0; i < m; i++) { scanf("%d", &a[i]); } qsort(a, m, sizeof(int), cmp); int ans = 0, cur = n; for (int i = 0; i < m && cur > 0; i++) { if (cur >= a[i]) { ans++; cur -= a[i]; } } printf("%d\n", ans); return 0; } ``` 在这个例子中,首先读入 n 和 m,分别表示油桶的容量和酱油的数量。然后,使用一个数组 a 存储每瓶酱油所占用的容量,并按照占用容量从小到大排序。接下来,使用一个循环卖出酱油,每次卖出一瓶酱油后,将当前油桶的容量减去该瓶酱油所占用的容量。如果当前油桶的容量小于 0,则说明无法再卖出酱油,此时需要结束卖酱油的过程。最后,将卖出的酱油数量乘以单价即为最终的收益。 需要注意的是,使用 qsort 函数对数组 a 进行排序时,需要传入一个比较函数 cmp,用来指定排序的方式。在比较函数中,需要将两个元素进行比较,并返回一个整数,表示它们之间的大小关系。在这个例子中,比较函数的实现方式为返回 a - b 的值,表示将 a 放在 b 的前面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值