【2023百度之星备赛】码蹄集 BD202305 糖果促销(二分)

题目

https://www.matiji.net/exam/brushquestion/5/4347/179CE77A7B772D15A8C00DD8198AAC74?from=1

题目大意:一颗糖果有一张糖纸,p 张糖纸可以换取一颗糖果。换出来糖果的包装纸当然也能再换糖果。小度想吃 k 颗糖果,他需要买多少颗糖?

分析

显然答案具有单调性,即买的糖果越多,最后能吃到的糖果也越多,反之亦然。所以可以考虑二分。具体来说,二分需要买的糖果数,每次二分判断获取到的糖果数是否>=k。如果>=k,说明答案还可以减小。时间复杂度为 O ( T l o g 2 k i ) O(Tlog_2{k_i}) O(Tlog2ki)

另外需要注意特殊情况:

  • p = 1 p=1 p=1的时候,只需要买1个就够了,因为可以一直用吃掉的糖果再换一个糖果,答案为1
  • k = 0 k=0 k=0的时候,显然不需要买糖果,答案为0
  • p = 1 且 k = 0 p=1且k=0 p=1k=0的时候,显然也不需要买糖果,答案为0

所以可以先特判 k = 0 k=0 k=0,再特判 p = 1 p=1 p=1

代码

#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

bool check(ll x, ll p, ll k) {
	ll y = x; // y表示糖纸数
	ll sum = x; // 糖果数
	while (y >= p) {
		sum += y / p; // 当前糖纸数能换的糖果数
		y = y % p + y / p; // 新的糖纸数 = 余下的糖纸数 + 新换的糖果的糖果纸数
	}
	return sum >= k;
}

int main( ) {
	int T;
	scanf("%d", &T);
	while (T -- ) {
		ll p, k;
		scanf("%lld%lld", &p, &k);

		// 特殊情况
        if (k == 0) { 
            cout << 0 << endl;
            continue;
        }
        if (p == 1) {
            cout << 1 << endl;
            continue;
        }

		ll l = 1, r = 1e9;
		ll mid;
		while (l < r) {
			mid = l + r >> 1;
			if (check(mid, p, k))
				r = mid;
			else
				l = mid + 1;
		}
		cout << l << endl; 
	}
	return 0;
}

总结

关于百度之星2022 BD202229项链相关的技术或活动信息,以下是一些可能的解释和背景: ### 百度之星与技术活动 百度之星是由百度公司主办的一项面向全国高校学生的大型编程竞活动。其目标是通过挑战性的问题设计,激发学生对算法、数据结构以及人工智能等领域的兴趣,并为优秀的学生提供展示才华的机会[^2]。 在2022年的百度之星活动中,可能涉及了名为“BD202229项链”的特定技术或案例研究。尽管具体的“BD202229项链”并未在公开资料中明确提及,但根据命名规则推测,这可能是与某种算法问题、优化模型或者实际应用场景(如珠宝设计中的排列组合问题)相关的内容。 ### 技术背景分析 “项链”这一术语在计算机科学领域中通常与字符串匹配、周期性检测或者排列组合等问题相关联。例如,在字符串算法中,“项链”可以用来描述一种特殊的循环排列模式,这种模式在密学、生物信息学等领域有广泛应用[^3]。 如果“BD202229项链”是一个具体的技术问题,那么它可能涉及以下内容: - **字符串匹配**:寻找最优的排列方式以满足某些约束条件。 - **动态规划**:解决复杂的排列组合问题,例如如何选择最优的珠子排列。 - **贪心算法**:在有限资源下最大化某个目标值,例如项链的美观度或价值。 ### 示例代 以下是一个简单的示例代,用于演示如何通过动态规划解决类似“项链”问题的排列组合优化: ```python def max_necklace_value(weights, values, limit): n = len(weights) dp = [0] * (limit + 1) for i in range(n): for j in range(limit, weights[i] - 1, -1): dp[j] = max(dp[j], dp[j - weights[i]] + values[i]) return dp[limit] # 示例输入 weights = [2, 3, 4, 5] values = [3, 4, 5, 6] limit = 8 # 调用函数 result = max_necklace_value(weights, values, limit) print(f"最大价值: {result}") ``` ### 活动相关信息 对于百度之星2022的具体活动信息,建议参考百度官方发布的事公告或技术博客。此外,可以通过以下途径获取更多信息: - 访问百度之星官方网站或其技术博客。 - 查阅比期间的技术分享文档或参者的解题报告。 - 在技术社区(如GitHub、知乎)搜索关键词“百度之星 2022 BD202229”。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值