剩余银饰的重量(C语言)

2024-02-21 15:04
文章标签 语言 重量 剩余 银饰

本文主要是介绍剩余银饰的重量(C语言),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块 最重的 银饰,然后一起熔掉。假设银饰的重量分别为 xyz,且 x <= y <= z。那么熔掉的可能结果如下:

  • 如果x == y == z,那么三块银饰都会被完全熔掉;
  • 如果x == yy != z,会剩余重量为z - y的银块无法被熔掉;
  • 如果x != yy == z,会剩余重量为y - x的银块无法被熔掉;
  • 如果x != yy != z,会剩余重量为z - yy - x差值的银块无法被熔掉。

如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可);如果只剩下一块,返回该块的重量;如果没有剩下,就返回 0

输入描述

输入数据为两行

第一行为银饰数组长度 n1 ≤ n ≤ 40

第二行为 n 块银饰的重量,重量的取值范围为[1,2000],重量之间使用空格隔开

输出描述

如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可);如果只剩下一块,返回该块的重量;如果没有剩下,就返回 0

示例一

输入

3
1 1 1
12

输出

0
1

说明

选出 1 1 1,得到 0,最终数组转换为 [],最后没有剩下银块,返回 0

示例二

输入

3
3 7 10
12

输出

1
1

说明

选出 3 7 10,需要计算 (7-3)(10-7) 的差值,即(7-3)-(10-7)=1,所以数组转换为 [1],剩余一块,返回该块重量,返回 1

思路

  1. 读取输入

    • 首先,从标准输入中读取银饰的数量 n
    • 然后,用一个数组 weight[] 存储每块银饰的重量,通过循环读取并存储。
  2. 排序银饰重量

    • 使用 C 语言内置的 qsort 函数对 weight[] 数组进行降序排列,这样每次都能直接获取最重的三块银饰。
  3. 熔炼逻辑

    • 当银饰数量大于等于3时,进入熔炼循环。
      • 在每一次循环中,取出当前最重的三块银饰(下标为 0、1、2 的元素)。
      • 根据题目给出的熔炼规则计算可能剩余的银块重量,并将结果存储到变量 piece 中。
      • 如果没有剩余(piece == 0),则继续下一轮循环;否则,将剩余重量 piece 加入数组,并更新当前银饰数量 n,然后重新对数组进行排序。
  4. 处理剩余银饰

    • 循环结束后,根据剩余银饰的数量决定输出结果:
      • 如果没有剩余银饰(n == 0),输出 0
      • 如果只剩一块银饰(n == 1),输出该块银饰的重量(输出weight[0]);
      • 如果剩余两块银饰(n == 2),比较这两块的重量并输出较大的那个重量(输出weight[0])。

代码

#include <stdio.h>
#include <stdlib.h>// 定义一个比较函数,用于对银饰重量进行降序排序
int cmp(const void *a, const void *b) {return *(int *)b - *(int *)a; // 按照从大到小的顺序排列
}// 计算熔炼后可能剩余的银块重量
int res(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 n;scanf("%d", &n); // 输入银饰的数量// 初始化银饰重量数组int weight[n];for (int i = 0; i < n; i++) {scanf("%d", &weight[i]); // 输入每一块银饰的重量}// 对银饰重量数组进行降序排序qsort(weight, n, sizeof(int), cmp);// 当银饰数量大于等于3时,持续熔炼while (n >= 3) {// 获取当前最重的三块银饰重量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 = res(x, y, z);if (piece == 0)continue;else {weight[n++] = piece;qsort(weight, n, sizeof(int), cmp); // 再次对剩余银饰进行降序排序}}// 根据最终剩余的银饰数量输出结果if (n == 0) {printf("0\n"); // 若没有剩余则输出0} else {printf("%d\n", weight[0]); // 否则输出剩余银饰的重量(数组中的最大值)}return 0;
}

文章目录

    • 题目描述
    • 输入描述
    • 输出描述
    • 示例一
    • 示例二
    • 思路
    • 代码

这篇关于剩余银饰的重量(C语言)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732173

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示