算法 14. 水晶问题

  • Description
  • Input
  • Output
  • 测试用例
    • 输入
    • 输出
  • 代码

Description

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

还有 10 天,就是心心念念的他生日了。

久莲希望把全世界最大最好看的水晶球送给他。

她找到了宝石收藏家亚瑟斯,希望能够寻求他的帮助。

亚瑟斯很快被打动了,拿出了精心收集的 n 块美丽的水晶石,这些水晶石初始是长宽高分别为 a 逗號 空格 b 逗號 空格 c 的长方体。亚瑟斯许诺久莲可以从中取走 1 块水晶石作为她礼物的原材料。

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

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

Input

第一行输入一个正整数 n 空格 左括号 1 小於等於 n 小於等於 10 的 5 次方 右括号;

接下来 n 行中,第 i 行输入三个正整数 a 下標 i 逗號 空格 b 下標 i 逗號 空格 c 下標 i 空格 左括号 1 小於等於 a 下標 i 逗號 空格 b 下標 i 逗號 空格 c 下標 i 小於等於 10 的 9 次方 右括号 表示第 i 块水晶石的长宽高。注意可能有两个长得一模一样的水晶石,但是在这种情况下还是将它们视作是两块不同的水晶石。

Output

第一行请输出一个正整数 k 空格 左括号 1 小於等於 k 小於等於 2 右括号,表示久莲选择的水晶球数量。

第二行请输出 k 个正整数,如果 k 等於 1,请输出一个正整数 x 空格 左括号 1 小於等於 x 小於等於 n 右括号 表示久莲选择的水晶石。如果 k 等於 2,则请输出两个正整数 x 逗號 空格 y 空格 左括号 1 小於等於 x 逗號 空格 y 小於等於 n 右括号 (用空格间隔),表示久莲希望亚瑟斯帮她将编号为 x 和 y 的水晶石融合成一块更大的水晶石,并选择用这块水晶石来打磨加工。请注意,这两块水晶石必须满足 “完美契合” 的条件,否则这个选择不合法。如果有多种最优的选择,则你可以输出任意一种合法的最优方案。

Hint
对于样例,如果久莲选择第六个水晶球,那么她可以打磨成半径为 r 等於 2.5 的水晶球,这是最优的选择。
这个题,稍微想想就有一个简化的思路了,就是需要排序两次。。其实仔细一想这个做法是有漏洞的。。不过还好测试数据没有在这里挖坑

测试用例

输入

6
1 2 3
4 1 1
4 2 3
4 2 3
4 3 3
5 5 5

输出

1
6

代码

#include <stdio.h>
#include <stdlib.h>//这是第十四题 水晶问题
typedef struct{long long int a;long long int b;long long int c;int number;
} cube;//首先,设置一个叫做方体的结构体来存储所有的水晶的结构。
cube crystal[100005],crystal2[100005];
int comp(const void* a,const void* b)
{return (*(cube*)b).c-(*(cube*)a).c;
}//在这里使用降序来给所有的长方体按照最短边排序 int comp2(const void* e,const void* f)
{return (*(cube*)f).b-(*(cube*)e).b;
}//在这里给所有的长方体按照中长边的降序排序
int main()
{long int n;long long int zu[3]={};scanf("%ld",&n);for(long int i=0;i<n;i++){scanf("%lld",&zu[0]);scanf("%lld",&zu[1]);scanf("%lld",&zu[2]);long long int m;for(int p=1;p<=2;p++)//用一个冒泡排序来给每一个长方体的三边进行排序 {for(int q=0;q<3-p;q++){if(zu[q]>zu[q+1]){m=zu[q];zu[q]=zu[q+1];zu[q+1]=m;}}}crystal[i].c=zu[0];crystal[i].b=zu[1];crystal[i].a=zu[2];crystal[i].number=i;//记录每一个长方体的数据 }qsort (crystal,n,sizeof(cube),&comp);//对所有的最短边进行降序排序 long int len=0;long long int max1=0;max1=crystal[0].c;//记录单个水晶可以雕刻出的最大水晶球 for(long int i=0;i<n;i++){if(crystal[i].b<max1){continue;}else{crystal2[len].a=crystal[i].a;crystal2[len].b=crystal[i].b;crystal2[len].c=crystal[i].c;crystal2[len].number=crystal[i].number;len++;}}//排除点所有不可能的长方体(也就是中长边长度小于单个水晶球最大值的长方体,因为我们在合并的时候一定要延长最短边才有意义) long int p1,p2;long long int max2=0;long long int now=0;qsort (crystal2,len,sizeof(cube),&comp2);//对所有合格的长方体按照中长边的长度排序 for(long int i=0;i<len-1;i++)//为了防止超时,只用一次遍历,因为中长边已经按降序排好了,所以可以合并的水晶一定是相连的 {if(crystal2[i].a==crystal2[i+1].a&&crystal2[i].b==crystal2[i+1].b){now=crystal2[i].c+crystal2[i+1].c;if(now>crystal2[i+1].b){now=crystal2[i+1].b;}if(now>max2){max2=now;p1=i;p2=i+1;}}}if(max1>max2){printf("1\n");printf("%ld\n",crystal[0].number+1);}else{printf("2\n");printf("%ld %ld\n",crystal2[p1].number+1,crystal2[p2].number+1);}return 0;
}

算法 14.水晶问题相关推荐

  1. 趣学算法14天阅读|Day1

    14天阅读挑战赛 文章目录 前言 编写博文背景 学习算法的好处 常见的招聘要求 如何高效学习算法 学习算法方式 如何进行刷题训练 如何进行算法面试 总结 前言

  2. 数据结构和算法-14.程序员常用10种算法

    1. 二分查找算法(非递归) 1.1 介绍 二分查找算法只适用于从有序的数列种进行查找,将数列排序后再进行查找 二分查找法的运行时间为对数时间O(log2 n),即查找到需要的目标位置最多只需要log ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法14:Ridge岭回归

    Python机器学习算法实现 Author:louwill 上一节我们讲到预防过拟合方法的Lasso回归模型,也就是基于L1正则化的线性回归.本讲我们继续来看基于L2正则化的线性回归模型. L2正则化 ...

  4. 【算法14】找出数组中两个只出现一次的数字

    [题 目]一个整型数组中除了两个数字外,其他的数字都出现两次.请找出这两个只在数组中出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). [思 路]首先我们考虑一个稍微简单点的情况:如果这个数 ...

  5. c/c++常用算法(14) -- 经典数据结构(约瑟环夫问题)

    一.简单的约瑟环夫 1.故事描述: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被 ...

  6. 洛谷【算法1-4】递推与递归

    P1255 数楼梯 对于 100% 的数据,1≤N≤5000. 高精度斐波那契 #include <iostream> using namespace std;const int N = ...

  7. 算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历

    leetcode-explore-learn-数据结构-二叉树1 1.二叉树的深度优先遍历 1.1前序遍历:中左右 1.2中序遍历:左中右 1.3后序遍历:左右中 2.二叉树的广度优先遍历 本系列博文 ...

  8. 线性表9 - 数据结构和算法14

    线性表9 让编程改变世界 Change the world by program 静态链表 这一节课,我们试图通过静态链表的讲解来瞻仰古人的伟大!(似乎人总要挂了之后才能变得伟大~_~) 神马是静态链 ...

  9. 数学推导+纯Python实现机器学习算法14:Ridge岭回归

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 上一节我们讲到预防过拟合方法的Lasso回归模型,也就是基于L1正 ...

最新文章

  1. 顺序表-顺序表表示集合-并集(A复制到C,B遍历比较C)
  2. Word 2010 制作文档结构之图标自动编号设置
  3. linux虚拟机tomcat上部署web项目的常用命令
  4. LeetCode 1456. 定长子串中元音的最大数目(滑动窗口)
  5. bat 存储过程返回值_使用Mybatis过程中遇到的坑
  6. python数组取数_python 取数组
  7. 吴恩达机器学习学习笔记第六章:机器学习中的线性代数操作python3版(含numpy、panda库的使用)
  8. uvm 形式验证_重复使用UVM RTL验证测试进行门级仿真详细过程介绍
  9. java中Executor、ExecutorService、ThreadPoolExecutor介绍(转)
  10. qpsk相点 matlab,qpsk调制解调matlab仿真程序详解
  11. 【Python123】汽车迷
  12. 第八届ACM程序设计大赛总结
  13. the JDBC Driver has been forcibly unregistered问题解决
  14. pytest之.pytest_cache文件夹作用【Pytest中的cache缓存功能】
  15. CAD中怎么在线缆上输入或删除文字?
  16. svg 树状图_树状图(关系图)
  17. C++输出流cout的执行顺序问题
  18. 计算机显卡的性能参数,关于电脑显卡的技术参数与性能的关系
  19. 小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的记录
  20. 自制AVA数据集工具/slowfast模型训练数据集制作

热门文章

  1. 2020届华为秋招数字芯片面试经验
  2. Python math.tau 常量
  3. 【计算机毕业设计】医院预约挂号系统
  4. 安卓的SMS 短信的增删改查
  5. Opencv4 CV_LOAD_IMAGE_GRAYSCALE找不到解决方法
  6. Vuex---在 Vue 组件中获得 Vuex 状态state
  7. OSChina 周四乱弹 ——产品经理被黑的最惨的一次
  8. oracle erp的库存管理软件,教你如何充分利用ERP库存管理系统
  9. 22-0001 淘宝店铺搜索界面
  10. LAMBDA工具箱阅读