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

news/2024/7/20 16:44:53 标签: c语言, 数据结构, 华为od

题目描述

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;
}

文章目录

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


http://www.niftyadmin.cn/n/5385475.html

相关文章

设备改造经历干扰处理

设备改造完了,终于松了口气。没过几天,客户打电话过来,刚松了的那口气立马又吊了起来。通过客户描述,感觉麻烦来了。 客户每台机器都用了4台伺服,国产某品牌的,之前就经常发生液压站压力变送器损坏、某个环节偶尔不工作等情况,通过增加滤波电路、分开走线等措施解决了。…

算法——数值算法——牛顿迭代法

目录 牛顿迭代法 一、1021: [编程入门]迭代法求平方根 牛顿迭代法 迭代法&#xff08;Iteration&#xff09;是一种通过反复递推计算来逼近解的方法。而牛顿迭代法&#xff08;Newtons method&#xff09;则是一种特定的迭代法&#xff0c;用于求解方程或函数的根、最小值、最…

2024-02-21 算法: 测试链表是否有环

点击 <C 语言编程核心突破> 快速C语言入门 算法: 测试链表是否有环 前言一、双指针 ( 快慢指针 )二、代码总结 前言 要解决问题: 一道简单的算法题, 测试链表是否含有环. 想到的思路: 哈希表, 将链表指针强制转换为整型, 利用求余法建立哈希函数. 太复杂, 内存效率不高…

Java8Optional笔记240220

Java8Optional Optional并不是提供功能, 而是提供一种null处理的规范,大家都用的话可能代码阅读起来容易一点? 源码很简单 获取实例(包装值)的3个方法: ofNullable( 和 of(和 empty() 构造器是private的, 有3个获取实例的静态方法 ofNullable( 和 of(和 empty() Optional…

ElasticSearch底层读写工作原理

目录 ES底层读写工作原理分析 ES写入数据的过程 ES读取数据的过程 根据id查询数据的过程 根据关键词查询数据的过程 写数据底层原理 ES底层读写工作原理分析 写请求是写入 primary shard&#xff0c;然后同步给所有的 replica shard&#xff1b;读请求可以从 primary sha…

python数据类型-集合set

1 集合&#xff08;set&#xff09;的定义 1.1 集合是一个无序且不重复元素的序列&#xff1a; 1&#xff09;无序&#xff1a;存储顺序和添加的顺序不一定相同&#xff0c;不支持索引、切片 2&#xff09;元素不重复&#xff1a;当添加重复元素时&#xff0c;集合会自动去重…

大语言模型Prompt提示词

大语言模型Prompt提示词 文章目录 大语言模型Prompt提示词Prompt基础常见的多轮对话里的PromptPrompt的结构说明Prompt基础策略复杂Prompt策略AdvertiseGen数据集中的提示词 Prompt基础 当体验完大语言模型LLM的新鲜感之后&#xff0c;写Prompt需要个人练习和思考才能快速掌握…

来看看投资界最关心的 Sora 几大问题

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…