掘金刷题2 | 豆包MarsCode AI刷题

105 阅读3分钟

小F的永久代币卡回本计划

题目描述

小F最近迷上了玩一款游戏,她面前有一个永久代币卡的购买机会。该卡片的价格为 a 勾玉,每天登录游戏可以返还 b 勾玉。小F想知道她至少需要登录多少天,才能让购买的永久代币卡回本。

测试样例

样例1:

输入:a = 10, b = 1
输出:10

样例2:

输入:a = 10, b = 2
输出:5

样例3:

输入:a = 10, b = 3
输出:4

思路分析

为了计算小F至少需要登录多少天,才能让购买的永久代币卡回本,我们可以通过逐步累积每天返还的勾玉,直到累积的勾玉数量等于或超过卡片价格。

  1. 初始化:设定一个累积勾玉的变量,初始值为0。
  2. 循环累积:每天返还 b 勾玉,累积到总勾玉数量中。
  3. 判断回本:每次累积后,检查总勾玉数量是否等于或超过卡片价格 a。如果是,输出当前的天数。
#include <iostream>
using namespace std;

int solution(int a, int b) {
    // write code here
    return (a + b - 1) / b;
    return 0;
}

int main() {
    cout << (solution(10, 1) == 10) << endl;
    cout << (solution(10, 2) == 5) << endl;
    cout << (solution(10, 3) == 4) << endl;
    return 0;
}

比赛配对问题

问题描述

小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:

  • 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
  • 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。

小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。


测试样例

样例1:

输入:n = 7
输出:6

样例2:

输入:n = 14
输出:13

思路分析

可以模拟比赛的过程,并计算每轮比赛的配对次数。

  1. 初始化:从初始队伍数 n 开始,记录当前轮次的比赛次数。

  2. 循环配对

    • 如果当前队伍数为偶数,进行 n / 2 场比赛,剩余 n / 2 支队伍。
    • 如果当前队伍数为奇数,进行 (n - 1) / 2 场比赛,剩余 (n - 1) / 2 + 1 支队伍。
  3. 累计比赛次数:每轮比赛后,将比赛次数加到总次数中。

  4. 重复步骤2和3,直到剩余队伍数为1,即决出唯一的获胜队伍。

完整代码

class Main {
    public static int solution(int n) {
        int matches = 0; // 初始化总配对次数
        
        while (n > 1) { // 只要队伍数大于1,就继续比赛
            if (n % 2 == 0) { // 当前队伍数是偶数
                matches += n / 2; // 进行 n/2 场比赛
                n /= 2; // 下一轮有 n/2 支队伍
            } else { // 当前队伍数是奇数
                matches += (n - 1) / 2; // 进行 (n-1)/2 场比赛
                n = (n - 1) / 2 + 1; // 下一轮有 (n-1)/2 + 1 支队伍
            }
        }
        return matches;
    }

    public static void main(String[] args) {
        System.out.println(solution(7) == 6);
        System.out.println(solution(14) == 13);
        System.out.println(solution(1) == 0);
    }
}