小F的永久代币卡回本计划
题目描述
小F最近迷上了玩一款游戏,她面前有一个永久代币卡的购买机会。该卡片的价格为 a 勾玉,每天登录游戏可以返还 b 勾玉。小F想知道她至少需要登录多少天,才能让购买的永久代币卡回本。
测试样例
样例1:
输入:
a = 10, b = 1
输出:10
样例2:
输入:
a = 10, b = 2
输出:5
样例3:
输入:
a = 10, b = 3
输出:4
思路分析
为了计算小F至少需要登录多少天,才能让购买的永久代币卡回本,我们可以通过逐步累积每天返还的勾玉,直到累积的勾玉数量等于或超过卡片价格。
- 初始化:设定一个累积勾玉的变量,初始值为0。
- 循环累积:每天返还
b勾玉,累积到总勾玉数量中。 - 判断回本:每次累积后,检查总勾玉数量是否等于或超过卡片价格
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
思路分析
可以模拟比赛的过程,并计算每轮比赛的配对次数。
-
初始化:从初始队伍数
n开始,记录当前轮次的比赛次数。 -
循环配对:
- 如果当前队伍数为偶数,进行
n / 2场比赛,剩余n / 2支队伍。 - 如果当前队伍数为奇数,进行
(n - 1) / 2场比赛,剩余(n - 1) / 2 + 1支队伍。
- 如果当前队伍数为偶数,进行
-
累计比赛次数:每轮比赛后,将比赛次数加到总次数中。
-
重复步骤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);
}
}