14. 水晶球

成绩

10

开启时间

2020年09月14日 星期一 12:00

折扣

0.8

折扣时间

2020年09月21日 星期一 00:00

允许迟交

关闭时间

2020年10月10日 星期六 23:00

Description

和许多同龄女孩子一样,久莲也喜欢水晶球。

还有10天,就是心心念念的他生日了。久莲希望把全世界最大最好看的水晶球送给他。她找到了宝石收藏家亚瑟斯,希望能够寻求他的帮助。亚瑟斯很快被打动了,拿出了精心收集的n块美丽的水晶石,这些水晶石初始是长宽高分别为a、b、c。亚瑟斯许诺久莲可以从中取走1块水晶石作为她礼物的原材料。

同时亚瑟斯有一种魔法,如果这两块长方形水晶石在某一个面能够完美的契合在一起(完美的契合是指这两个长方形面全等),那么可以将它们融合成一块完整的大石头,如果真的实现的话,那么久莲就可能打磨出更大的水晶球啦!

久莲太希望把最美最大的水晶球送给他了,你快帮帮她如何选择吧。


1、知识补充

首先把一些预热知识放在最前面,这道题的实现离不开排序,最重要的是对结构体的分类排序。

你应该在学c已经学会了冒泡排序、选择排序呀啥的,不知道你忘了没,鸡翅有总结过哦,你可以复习复习。贴心送上传送门:

选择排序       插入排序

但是c++的algorithm库里已经有实现好的sort排序函数,它肯定比你写的肯定更快更好,而且它可以实现很多种类别的排序:int、char...最强的是,可以对结构体排序。如果不熟悉sort函数的使用,一定先看看鸡翅总结的这篇文章速成一下:排序算法 | sort函数的使用,再看题解,不然你可能会一脸懵嘻嘻~

2、预处理

这个题就是个很典型的贪心问题,想明白了思路就很简单。

为了让数据方便处理,我们希望将每一个长方体的数据存放在一起(由于输出需要标示长方体,所以我们除了长宽高数据还需要记录id),那就应该用一个结构体crystal描述长方体的数据。所有的长方体我们需要一个crl[ ]的结构体数组来储存。结构体的定义和结构体数组的声明如下:

struct crystal {long long id;  //水晶石的标号long long length, width, height; //水晶石的长宽高
} crl[MAXN];

接下来分析几点重要的:

首先我们应该要明白,水晶球的大小完全由长方体的最短边决定!我们的目的就是让最短边的最长!

那么对于一个长方体(length,width,height)为了方便处理,需要规定一下:length > width > height。这一步可以在处理输入的时候完成。所以在合并水晶球的时候,我们只要选择 length * width 这个面合并以增大最短边。其他面合并是没有意义的,因为本质上不会增大最短边!

3.核心算法

经过预处理后,接着处理分为两部分:

1、不合并
        一一遍历结构体数组中的每一个长方体,找到最大的height,记录下其对应的id(编号)。

2、合并
       先对结构体数组进行排序,优先以length关键字排序,如果相同就以width为关键字排序,如果再相同就以heigjt为关键字排序。
       这样排序完,length*width 面可以合并的情况就只会出现在相邻的长方体上,所以我们只需要考虑相邻长方体的合并了!大大减少了我们的讨论次数!

接下来我们一一枚举相邻的长方体是否能合并:如果能合并,计算合并后的最短边。如果比当前最长最短边还要长,则更新最长最短边,并留下对应的两个id。

比如长方体A1(length,width,height1)和 长方体A2(length, width, height2)的合并结果为:(length,width,height1+height2)。注意,合并之后的最短边为:min(width, height1+height2)


下面附上完整代码:

#include <cstdio>
#include <algorithm>#define MAXN 100050using namespace std;struct crystal {long long id;  //水晶石的标号long long length, width, height; //水晶石的长宽高
} crl[MAXN];bool cmpForStruct(struct crystal x, struct crystal y) {if (x.length != y.length)  //先按长度排序return x.length > y.length;else if (x.width != y.width)  //再按宽度排序return x.width > y.width;elsereturn x.height > y.height;   //最后按照高度排序
}int main() {long long n;scanf("%lld\n", &n);long long maxHeight = 0;  //记录水晶石的最高高度long long x = 0, y = 0;  //记录选择水晶石的标号,当不可以合并时,只取xfor (long long i = 0; i < n; i++) {long long temp[3];  //暂用来排序的数组scanf("%lld%lld%lld", &temp[0], &temp[1], &temp[2]);  //将输入的长宽高先放到数组temp中sort(temp, temp + 3);  //对temp数组[0,2]进行从小到大排序//将输入更新到结构体数组中crl[i].id = i + 1;crl[i].length = temp[2];crl[i].width = temp[1];crl[i].height = temp[0];//记录单个水晶石的最大高度if (crl[i].height > maxHeight) {maxHeight = crl[i].height;x = crl[i].id;  //记下标号}}sort(crl, crl + n, cmpForStruct);  //对水晶石结构体数组[0,n-1]进行排序,按照长、宽、高优先级排序//依次讨论相邻水晶石合并的问题for (long long i = 0; i < n - 1; i++) {if (crl[i].length == crl[i + 1].length && crl[i].width == crl[i + 1].width) {long long temp = crl[i].height + crl[i + 1].height;  //合并//计算合并之后的最短边if (temp > crl[i].width)temp = crl[i].width;//更新两个水晶石的最大高度if (temp > maxHeight) {maxHeight = temp;x = crl[i].id;  //记下标号,不要以为下标+1就是id,你要记得我们对结构体数组排序过....y = crl[i + 1].id;}}}if (y == 0)printf("%d\n%lld\n", 1, x);elseprintf("%d\n%lld %lld\n", 2, x, y);}


end

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

水晶球 | 贪心、排序相关推荐

  1. 【第十四题】水晶球|贪心(北理工/北京理工大学/程序设计方法与实践/小学期 )

    目录 Description 思路: 几个点: 代码: Description 直接c v过来的,有很多符号,懒得改了,仅为搜索引擎而放进来) 和许多同龄女孩子一样,久莲也喜欢水晶球.  还有 10 ...

  2. 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子

    耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...

  3. HDU 4442 Physical Examination(关于贪心排序)

    这个题目用贪心来做,关键是怎么贪心最小,那就是排序的问题了. 加入给定两个数a1, b1, a2, b2.那么如果先选1再选2的话,总的耗费就是a1 + a1 * b2 + a2; 如果先选2再选1, ...

  4. CF922D Robot Vacuum Cleaner 贪心+排序

    正确的贪心方法:按照比例排序. code: #include <bits/stdc++.h> #define N 200000 #define ll long long #define s ...

  5. 【2018icpc宁夏邀请赛现场赛】【Gym - 102222H】Fight Against Monsters(贪心排序)

    题干: It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagna ...

  6. 【CCCC】L3-017 森森快递 (30分),线段树rmq模板+贪心排序

    problem L3-017 森森快递 (30分) 森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由 ...

  7. bzoj 1634: [Usaco2007 Jan]Protecting the Flowers 护花(贪心排序)

    1634: [Usaco2007 Jan]Protecting the Flowers 护花 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 824  S ...

  8. C算法-贪心+排序+双指针

    leetcode435,无重叠区间.给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. [ [1,2], [2,3], [3,4], [1,3] ]移除1,3即可. leetcode ...

  9. 【52. 贪心 - 排序不等式(排队打水)】

    分析 当第i个人打水时,n-i个人都要在等待,i从1到n-1: 则总时间为b[1](n - 1) + b[2](n-2)+···+b[n-1]*1. 所以我们可以看出,要想让排队等待时间综合最小,一定 ...

最新文章

  1. swift笔记——环境搭建及Hello,Swift!
  2. R语言构建xgboost模型:模型的特性重要度计算及可视化、模型对应的结构树(文本文件)
  3. dede:arclist 不能调用文章的副栏目或多个副栏目的解决方法
  4. keytool安装tls证书_TLS使用指南(一):如何在Rancher 2.x中进行TLS终止?
  5. oracle sql判断相等,Oracle PL/SQL判断两个字段相等或不等问题
  6. iotop--补齐系统监视工具缺失的一环
  7. 【转】微服务实践(五):微服务的事件驱动数据管理
  8. Python(3)-Pycharm基本使用技巧
  9. 小米wifi每天晚上准时断网_小米 11再次确定,将于28日准时发布,售价更感人
  10. html层次选择器例题,详解强大的jQuery选择器之基本选择器、层次选择器
  11. Oracle的tnsnames.ora配置(PLSQL Developer)
  12. SpringCloud和SpringBoot组件对比
  13. 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
  14. CI框架之连接数据库
  15. 经典多级时间轮定时器(C语言版)
  16. python股票接口_python获取股票数据接口
  17. 高等数学张宇18讲 第四讲 一元函数微分学的几何应用
  18. 微软全球副总裁洪小文:微软未来的三大战略
  19. Simhash算法介绍和应用内容
  20. 模式识别和机器视觉智能方面的论文投稿---国际著名期刊杂志论文投稿

热门文章

  1. .\Objects\stm32f4.axf: Error: L6320W 错误分析
  2. 软件如何「吞噬」汽车?
  3. RTS游戏中的战争迷雾原理
  4. HTML中属性id和属性name有何区别?
  5. 纯PHP代码最好在文件末尾删除 PHP 结束标记 ‘?>‘
  6. HTML 基本属性大全(一)
  7. 如何快速的成为一个合格的Oracle DBA?
  8. Nginx之7移花接木 - (反向代理) 1
  9. 《韩国社会与文化》学习笔记
  10. linux 转换工具 convert的使用