最近在练习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);
}
}