蓝桥杯 2015初赛 饮料换购 暴力 数学

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


文章目录

  • 蓝桥杯2015初赛 饮料换购
    • 题目描述
    • 输入
    • 输出
    • 样例输入
    • 样例输出
    • 分析
      • 暴力
      • 数学思路

蓝桥杯2015初赛 饮料换购

题目描述

乐羊羊饮料厂正在举办一次促销优惠活动。
乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动。
那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。

输入

输入存在多组测试数据
每组测试数据输入一行包含一个正整数n(1<=n<=10000)

输出

对于每组数据输出一行,包含一个整数,表示实际得到的饮料数

样例输入

100
101

样例输出

149
151

分析

暴力

不断的跟 3 相除相余,时间复杂度只有 O ( n ) O(n) O(n)
蓝桥杯 2015初赛 饮料换购 暴力 数学_第1张图片

/*
 * @Author: motongxue
 * @Date: 2020-09-07 20:37:33
 * @LastEditors: motongxue
 * @LastEditTime: 2020-09-07 20:39:37
 * @Blog: https://motongxue.cn
 * @Description: file content
 */
import java.util.Scanner;

public class Main {
     
    public static void main(String[] args) {
     
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
     
            int n = sc.nextInt();
            int sum = n;
            while(n/3!=0){
     
                sum += n/3;
                n = n/3 + n%3;
            }
            System.out.println(sum);
        }
        
    }
}

数学思路

每三瓶可以兑换一瓶,也就是每次减三后必须要加一。因此实际上是每两瓶可以使得答案加一。
但是有一种特殊情况,即当饮料数为2的时候,此时无法兑换,需要特判。

根据乘法的性质:
奇数 * 奇数 = 奇数
偶数 * 奇数 = 偶数

也就是说,如果一开始有奇数瓶饮料x,根据每三换一的规则,若x是3的倍数,那么兑换一次后仍然是奇数瓶;若不是3的倍数,那么 x % 3 + x / 3 也是奇数。所以无需特判,答案为 x + x / 2。

如果一开始是偶数瓶饮料x, 根据兑换规则,若x是3的倍数,那么兑换一次后仍然是偶数瓶;若不是3的倍数,那么 x % 3 + x / 3 也是偶数。这样偶数瓶饮料不停的兑换,最后一定会小于3,根据前面推出的性质,最后的数一定是偶数,因此是2。
需要特判,答案为 x + x / 2 - 1.

/*
 * @Author: motongxue
 * @Date: 2020-09-07 20:37:33
 * @LastEditors: motongxue
 * @LastEditTime: 2020-09-07 20:39:37
 * @Blog: https://motongxue.cn
 * @Description: file content
 */
import java.util.Scanner;

public class Main {
     
    public static void main(String[] args) {
     
        Scanner sc = new Scanner(System.in);
        int n;
        while (sc.hasNext()) {
     
            n = sc.nextInt();
            if (n == 0)
                System.out.println(0);
            else {
     
                int t = n / 2;
                if (n % 2 == 1)
                    System.out.println(n + t);
                if (n % 2 == 0)
                    System.out.println(n + t - 1);
            }

        }
    }
}


2020年9月7日更

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


你可能感兴趣的:(#,数论,算法,git,数据结构,leetcode,java)