10.10 b站经验增长

发布时间 2023-10-13 23:11:48作者: liuxuechao
小蒲非常喜欢刷b站,天天都去刷,作为2017年才加入b站的萌新,白嫖了好多年,积攒了上千的硬币,以至于他现在才5级,于是他想要快速积攒经验,众所周知,每天b站会给登录用户1枚硬币,1枚硬币的经验值为10经验值,每天最多可以投5枚硬币获得经验值,也就是每一天可以通过投币最多获得50经验,他想要以最快的方式通过投币获得最多的经验,直到他的硬币数为0时停止投币,请问他这期间能获得的经验值为多少,经过了多少天?

输入格式:

第一行输入一个整数T,代表数据的组数

接下来的T行,每一行有一个整数n,代表他今天拥有的硬币数(已经获得当天的奖励硬币)

输出格式:

输出T行,每一行两个数a,b,a代表他所获得的经验值,b代表经过了多少天。

输入样例:

1
6

输出样例:

70 2

第一天:他拥有6枚硬币,他投5枚,获得了50点经验值。

第二天:奖励一枚硬币,他拥有2枚硬币,他投2枚,获得了20点经验值,剩余0枚硬币。

 

在第一次写这个代码的时候,采取的方法只是循环嵌套,以为这样可以少思考一下,结果发现运行超时,最后采用下面算法,,少了一个嵌套的循环,大大节约了运行时间。

 

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
    long long int n;
    cin >> n;
    long long int count_coin;
    for (long long i = 0; i < n; i++)
    {
        cin >> count_coin;
        long long int get_ = 0, day = 0,aday = 0;
        /*while (count_coin != 0)
        {
            if (day != 0)count_coin++;
            if (count_coin >= 5)
            {
                count_coin -= 5;
                get_ += 5 * 10;
                day++;
            }
            else
            {
                get_ += count_coin * 10;
                count_coin = 0;
                day++;
            }
        }*///运行超时
        int flag = 1;
        while (1)
        {
            if (count_coin >= 5)
            {
                aday = count_coin / 5;
                day += aday;
                count_coin -= 5 * aday;
                if(flag)count_coin += aday - 1;
                else count_coin += aday;
                get_ += aday * 50;
                flag = 0;
            }
            else
            {
                day++;
                if (!flag) count_coin++;
                get_ += count_coin * 10;
                break;
            }
        }
        cout << get_ << " " << day;
        if (i != n - 1) cout << endl;
    }
}