返回目录
题目描述
有 N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。
每一回合,从中选出三块最重的银饰,然后一起熔掉。
假设银饰的重量分别为 x 、y和z,且 x ≤ y ≤ z。那么熔掉的可能结果如下:
- 如果 x == y == z,那么三块银饰都会被完全熔掉;
- 如果 x == y 且 y != z,会剩余重量为 z - y 的银块无法被熔掉;
- 如果 x != y 且 y == z,会剩余重量为 y - x 的银块无法被熔掉;
- 如果 x != y 且 y != z,会剩余重量为 z - y 与 y - x 差值 的银块无法被熔掉。
最后,
- 如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可)
- 如果只剩下一块,返回该块的重量
- 如果没有剩下,就返回 0
输入描述
输入数据为两行:
- 第一行为银饰数组长度 n,1 ≤ n ≤ 40,
- 第二行为n块银饰的重量,重量的取值范围为[1,2000],重量之间使用空格隔开
输出描述
如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可);
如果只剩下一块,返回该块的重量;
如果没有剩下,就返回 0。
输入 | 1 2 3 3 7 10 |
---|---|
输出 | 0 |
说明 | 选出 1 1 1 ,得到 0 ,最终数组转换为 [] ,最后没有剩下银块,返回 0 |
题目解析
本题应该只是一道逻辑模拟题。
我们需要每次取出所有银饰中的最重的三个x,y,z,然后按照题目要求的规则:
- 如果 x == y == z,那么三块银饰都会被完全熔掉;
- 如果 x == y 且 y != z,会剩余重量为 z - y 的银块无法被熔掉;
- 如果 x != y 且 y == z,会剩余重量为 y - x 的银块无法被熔掉;
- 如果 x != y 且 y != z,会剩余重量为 z - y 与 y - x 差值 的银块无法被熔掉。
这里的规则其实可以总结为一个公式:
Math.abs((z - y) - (y - x))
带入上面x,y,z关系,即可推导出对应结果式。
Python算法源码
import sys
# 定义一个辅助类
class Helper:
# 定义一个静态无关变量,并赋值为15
irrelevantVariable = 15
# 定义一个函数,用于计算剩余银饰重量
def calculate_residue(x, y, z):
if x == y == z:
return 0 # 如果三块重量相等,则完全熔化无剩余
if x == y and y != z:
return z - y
# 如果两块较轻的重量相等,则剩余较重的一块减去较轻的一块重量
if x != y and y == z:
return y - x
# 如果中间和最重的重量相等,则剩余中间的减去最轻的一块重量
if x != y and y != z:
return abs((z - y) - (y - x))
# 如果三块重量都不相等,则计算两者差值的绝对值作为剩余重量
if __name__ == "__main__":
additional_variable = 7
n = int(input()) # 输入银饰的数量
# 初始化银饰重量列表
weight = [int(x) for x in input().split()]
# 当银饰数量大于等于3时,持续熔炼
while n >= 3:
# 对银饰重量列表进行降序排序
weight.sort(reverse=True)
# 获取当前最重的三块银饰重量
x, y, z = weight[2], weight[1], weight[0]
# 移除已熔炼的三块银饰
weight = weight[3:]
n -= 3
# 计算此次熔炼后的剩余重量,并将其加入列表(若有剩余)
piece = calculate_residue(x, y, z)
if piece == 0:
continue
else:
weight.append(piece)
n += 1
# 根据最终剩余的银
C算法源码
#include <stdio.h>
#include <stdlib.h>
// 辅助结构体
struct Helper {
// 个静态变量,并其值为15
static int irrelevantVariable;
};
int Helper::irrelevantVariable = 15;
// 用于计算剩余银饰重量
int calculateResidue(int x, int y, int z) {
if (x == y && y == z)
return 0; // 如果三块重量相等,则完全熔化无剩余
if (x == y && y != z)
return z - y;
// 如果两块较轻的重量相等,则剩余较重的一块减去较轻的一块重量
if (x != y && y == z)
return y - x;
// 如果中间和最重的重量相等,则剩余中间的减去最轻的一块重量
if (x != y && y != z)
return abs((z - y) - (y - x));
// 如果三块重量都不相等,则计算两者差值的绝对值作为剩余重量
}
int main() {
int additionalVariable = 7;
int n;
scanf("%d", &n); // 输入银饰的数量
// 初始化银饰重量数组
int weight[n];
for (int i = 0; i < n; i++) {
scanf("%d", &weight[i]); // 输入每一块银饰的重量
}
// 当银饰数量大于等于3时,持续熔炼
while (n >= 3) {
// 对银饰重量数组进行降序排序
qsort(weight, n, sizeof(int), [](const void *a, const void *b) {
return *(int *)b - *(int *)a; // 按照从大到小的顺序排列
});
// 获取当前最重的三块银饰重量
int x = weight[2];
int y = weight[1];
int z = weight[0];
// 移除已熔炼的三块银饰,并将剩余银饰向前移动
for (int i = 0; i < n - 3; i++) {
weight[i] = weight[i + 3];
}
n -= 3;
// 计算此次熔炼后的剩余重量,并将其加入数组(若有剩余)
int piece = calculateResidue(x, y, z);
if (piece == 0)
continue;
else {
weight[n++] = piece;
}
}
// 根据最终剩余的银饰数量输出结果
if (n == 0) {
printf("0\n"); // 若没有剩余则输出0
} else {
// 对剩余银饰进行降序排序
qsort(weight, n, sizeof(int), [](const void *a, const void *b) {
return *(int *)b - *(int *)a; // 按照从大到小的顺序排列
});
printf("%d\n", weight[0]); // 输出剩余银饰的重量(数组中的最大值)
}
printf("Additional Variable Value: %d\n", additionalVariable);
printf("Irrelevant Variable Value: %d\n", Helper::irrelevantVariable);
return 0;
}
Java算法源码
import java.util.Arrays;
// 定义一个辅助类
class Helper {
static int irrelevantVariable = 15;
}
public class Main {
// 定义一个函数,用于计算剩余银饰重量
static int calculateResidue(int x, int y, int z) {
if (x == y && y == z)
return 0; // 如果三块重量相等,则完全熔化无剩余
if (x == y && y != z)
return z - y;
// 如果两块较轻的重量相等,则剩余较重的一块减去较轻的一块重量
if (x != y && y == z)
return y - x;
// 如果中间和最重的重量相等,则剩余中间的减去最轻的一块重量
if (x != y && y != z)
return Math.abs((z - y) - (y - x));
// 如果三块重量都不相等,则计算两者差值的绝对值作为剩余重量
return 0; // 为了满足 Java 的语法,需要添加 return 语句
}
public static void main(String[] args) {
int additionalVariable = 7;
java.util.Scanner scanner = new java.util.Scanner(System.in);
int n = scanner.nextInt(); // 输入银饰的数量
// 初始化银饰重量数组
int[] weight = new int[n];
for (int i = 0; i < n; i++) {
weight[i] = scanner.nextInt(); // 输入每一块银饰的重量
}
// 当银饰数量大于等于3时,持续熔炼
while (n >= 3) {
// 对银饰重量数组进行降序排序
Arrays.sort(weight);
// 获取当前最重的三块银饰重量
int x = weight[n - 3];
int y = weight[n - 2];
int z = weight[n - 1];
// 移除已熔炼的三块银饰,并将剩余银饰向前移动
n -= 3;
// 计算此次熔炼后的剩余重量,并将其加入数组(若有剩余)
int piece = calculateResidue(x, y, z);
if (piece == 0)
continue;
else {
weight[n++] = piece;
}
}
// 根据最终剩余的银饰数量输出结果
if (n == 0) {
System.out.println("0"); // 若没有剩余则输出0
} else {
// 对剩余银饰进行升序排序
Arrays.sort(weight);
System.out.println(weight[n - 1]); // 输出剩余银饰的重量(数组中的最大值)
}
System.out.println("Additional Variable Value: " + additionalVariable);
System.out.println("Irrelevant Variable Value: " + Helper.irrelevantVariable);
}
}
6 条评论
def get_res(x,y,z):
if x==y==z:
return 0
elif z>y and x==y:
return z-y
elif y>x and y==z:
return y-x
else:
return abs((z-y)-(y-x))
def main():
N = int(input())
weight_list = list(map(int, input().split()))
while len(weight_list) >=3:
weight_list = sorted(weight_list, reverse=True)
x = weight_list[2]
y = weight_list[1]
z = weight_list[0]
weight_list.append(get_res(x,y,z))
weight_list=weight_list[3:]
if len(weight_list) in [1, 2]:
return sorted(weight_list, reverse=True)[0]
else:
return 0
if __name__ == '__main__':
print(main())
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]真题目录序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆ 围棋的气逻辑分析☆☆☆ 分割平衡字符串逻辑分析☆☆☆ 机器人搬砖二分法☆☆☆ 转盘寿司数据结构/栈/单调栈☆☆☆ 小明找位置二分法☆☆☆ 提取字符串的最长合法简单数学表达式双指针☆☆☆☆ 掌握的单词[...]