当前位置: 首页 > news >正文

超级码力在线编程大赛初赛第1场-2-正三角形拼接题解

目录

    • 题目描述
    • 示例
      • 输入
      • 输出
    • 说明
    • 题解
    • 代码

在这里插入图片描述

题目描述

给出n根木棍,每次切割可以将1根木棍切成2段。 请计算出最少切割几次,可以从所有木棍中选出3根,组成一个正三角形。

一开始的木棍根数为n,3<=n<=1000。 所有木棍的长度为一个整型数组lengths[],1<=lengths[i]<=1e9。切割必须要将木棍分成2根整数长度的木棍,而且总长度要和原木棍相等。题目数据保证有解。

示例

输入

[2,3,7,5]

输出

2

说明

可以从长为7的木棍中,切出2根长为3的木棍,那么木棍的长度应该为[2,3,1,3,3,5],可以拼出边长为3的正三角形。

题解

这道题目其实选择了一个比较复杂的场景,但问了一个很简单的问题。如果这道题目问至少切割多少次可以拼出一个三角形,那么难度就完全不在一个量级上了。

这里问拼成正三角形,也就是问切割几次可以得到三根一样长的木棍

入手点应该在于:原本存不存在一样长的木棍?

  1. 如果原本就有三根一样长的木棍,那么不用切割,切割次数为0。

  2. 如果原本有两根一样长的木棍,那么有可能只需要再切割一次,再得到一根这样长的木棍就可以,但也有可能无法再切出这样长的木棍,比如:1,3,3。总结起来,只要有比该长度还长的木棍,就只需要切割1次。

  3. 如果给的一堆木棍中不存在一样长的木棍,那么需要切割几次呢?三次吗?当然不要这么傻,最多切割两次,得到两根和最短长度一样长的木棍,就可以了!比如:1,2,3,从后两根中各切割一次,再得到两根1,不就可以了吗!但是观察到,我切一次2,不就得到了两个1了吗,所以这里只需要切割一次就行了。也就是如果存在某一根木棍是另一根木棍长度的2倍,那么只切1次就行了。

上面的情况有点多,不过按部就班地,分情况一个个讨论就行了。先对木棍按长度排序,之后遍历每一根木棍讨论每一种情况就可以了。下面是详细代码,还可以通过剪枝进行进一步简化,比如如果当前最优解为切1次,那么只需要再检查是否切0次可行就可以了,没必要再检查所有的情况。但时间复杂度不会有区别。

代码

class Solution {
	public:
		int makeEquilateralTriangle(vector<int> &lengths) {
			sort(lengths.begin(),lengths.end());
			int rs=2;
			for(int i=0; i<lengths.size(); i++) {
				if(lengths.size()-1-i>=2) {
					//该木棍后面还有两根以上木棍
					//可以通过切两次解决
					rs=min(rs,2);
					//如果存在两根等长,可以切一次解决
					if(lengths[i+1]==lengths[i]) {
						rs=min(rs,1);
					}
					如果存在三根等长,可以切零次解决
					if(lengths[i+1]==lengths[i] &&lengths[i+2]==lengths[i]) {
						rs=min(rs,0);
					}
				}
				//再找一找有没有2倍长度关系
				if(lengths.size()-1-i>=1)
					for(int j=i+1; j<lengths.size(); j++) {
						if(lengths[j]==2*lengths[i]) {
							rs=min(rs,1);
						}
					}
			}
			return rs;
		}
};

相关文章:

  • 超级码力在线编程大赛初赛第1场-4-对称前后缀题解
  • C++程序设计:相邻数对
  • C++程序设计:字符阵列(三角形字符阵列图形的打印)
  • C++程序设计:相反数
  • C++程序设计:折叠方阵
  • C++程序设计:消除类游戏
  • MaxDSNSize 未设置
  • C++程序设计:图像旋转
  • C++程序设计:分解质因数
  • 设置NTFS权限以避免通过webshell遍历主机目录(原创)
  • C++程序设计:打印杨辉三角形
  • 如何安装一个安全的动网(转)
  • C++程序设计:字符图形输出(数字三角形)
  • 远程分析IIS设置(转)
  • C++程序设计:字符图形输出(空白三角形)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Docker容器管理
  • ES6核心特性
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • MaxCompute访问TableStore(OTS) 数据
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Objective-C 中关联引用的概念
  • React+TypeScript入门
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Web设计流程优化:网页效果图设计新思路
  • 代理模式
  • 分布式事物理论与实践
  • 计算机常识 - 收藏集 - 掘金
  • 聊聊flink的BlobWriter
  • 如何学习JavaEE,项目又该如何做?
  • 我的面试准备过程--容器(更新中)
  • 一个SAP顾问在美国的这些年
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​linux启动进程的方式
  • #pragma once与条件编译
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言)fgets与fputs函数详解
  • (C语言)fread与fwrite详解
  • (Java数据结构)ArrayList
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十一)c52学习之旅-动态数码管
  • (四)鸿鹄云架构一服务注册中心
  • (一)u-boot-nand.bin的下载
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 程序发生了一个不可捕获的异常
  • .NET 反射 Reflect
  • .net 微服务 服务保护 自动重试 Polly