• 蓝桥杯 饮料换购 数学推导


    题目描述

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

    输入

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

    输出

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

    样例输入 Copy

    100
    101

    样例输出 Copy

    149
    151




    每三瓶可以兑换一瓶,也就是每次减三后必须要加一。因此实际上是每两瓶可以使得答案加一。
    但是有一种特殊情况,即当饮料数为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.

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     int n;
    11     while(scanf("%d", &n) != EOF)
    12     {
    13         if(n == 0)
    14             printf("0
    ");
    15         else
    16         {
    17             int t = n / 2;
    18             if(n % 2 == 1)
    19                 printf("%d
    ", n + t);
    20             if(n % 2 == 0)
    21                 printf("%d
    ", n + t - 1);
    22         }
    23 
    24     }
    25     return 0;
    26 }
     
  • 相关阅读:
    获取txt文件的内容
    MAT(Memory Analyzer Tool)下载和安装
    转换流:指定编码 读取文本文件InputStreamReader和写出文本文件OutputStreamWriter 字符集
    切入点表达式
    并发时事务引发的问题和事务的隔离级别
    多线程之join方法
    多线程之守护线程
    约束:主键、非空、唯一、外键
    数据库设计
    PLSQL过期解决办法
  • 原文地址:https://www.cnblogs.com/daybreaking/p/12237758.html
Copyright © 2020-2023  润新知