19~~◮◮◮
int T;
scanf("%d", &T);
// 2. 遍历每个测试用例
for (int cas = 1; cas <= T; ++cas)
{ // cas 是当前用例的编号(如 Case #1)
long long k;
scanf("%lld", &k); // 读取当前第k大的总重量)
// 3. 找 k 的二进制最高位位置 h:
// 目的:确定从哪一位开始处理二进制位(如 k=7 是 111,最高位是第 2 位,对应 2^2=4)
int h = 0;
// 循环找到最大的 h 使得 2^(h+1) <= k
while ((1LL << (h + 1)) <= k)
++h;
long long res = 0; // 存储最终结果(三进制转换后的值)
// 4. 逐位处理二进制位,转换为三进制:
// 逻辑:k 的二进制位 → 代表是否选对应 3^i 的土豆 → 按三进制计算总和
for (int i = h; i >= 0; --i)
{ // 从最高位到最低位遍历
// 判断 k 的第 i 位是否为 1(用位运算提取)
int digit = (k & (1LL << i)) ? 1 : 0;
// 例:当前 res 是高位的三进制值,乘以 3 相当于左移一位,加上当前位的 0/1
res = res * 3 + digit;
}
printf("Case #%d: %lld\n", cas, res);
}
return 0;
收获:“Case #$Num: \(A”,其中,\)N表示第Num组样例,就是把第N个大的打出来($A表示他可以获得的第k大的总重量)
<< 是左移,只有左移1位时,等价于“乘以2”(即2¹);左移2位等价于“乘以4”(即2²)…… 左移 n 位等价于 乘以 2ⁿ ,而不是“平方”。
二进制数从低位到高位的每一位,依次表示是否选从小到大的土豆(3⁰, 3¹, 3²…),而二进制数本身的大小顺序,决定了这些选法的和的大小顺序。


浙公网安备 33010602011771号