幸运袋子(详解)

题目分析

  一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
  你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。

解题思路

  这道题的本质是在集合中找出符合条件的子集。
  对于两个任意正整数a,b来说,如果a+b<ab,则必须有一个数为1,可以用数论来证明,这里不再赘述。
  推广到任意k个正整数,假设a1,a2,…ak,如果不满足条件,即sum<=multi,如果再选一个数使sum+b > multi
b,这个b一定是1,相反,如果选择的b>1,则sum+b < multi*b,那么a1,a2,…ak,b就不满足给定的条件。
  所以要将这些球进行升序排序。每次从小到大选择,当选择到a1,a2,…ak-1时满足给定条件,再增加ak是不满足条件,那么ak必然要大于等于之前的最大值,如果继续向后选择更大的数,必然无法满足给定条件。
  如果有多个1,并且k=1使不满足条件,但是下一个元素仍为1,就可以满足条件,所以当位置吐过是1,虽然不满足条件,但是应该继续向后搜索,因为仍然有可能满足条件。
对于重复的数字,组合只能算一个,所以要跳过这个数字,也就是去重

代码实现(必要的地方有注释)

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int  getLuckBox(vector<int> x, size_t n, size_t pos, int sum, int multi)
{int count = 0;for (size_t i = pos; i < n; ++i){sum += x[i];multi *= x[i];if (sum > multi){//如果当前位置可以满足要求,就继续从下一个位置开始count += 1 + getLuckBox(x, n, i + 1, sum, multi);}else if (x[i] == 1){//如果这个位置是1并且不满足,可以从下一个位置尝试count += getLuckBox(x, n, i + 1, sum, multi);}else{//如果当前位置不满足,那么之后更大的数字也不可能满足,直接直接返回,不再查找break;}//在搜索下一个位置前,要先恢复sum和multisum -= x[i];multi /= x[i];//如果喝下一个位置一样,就直接跳过,不能有重复while (i < n - 1 && x[i] == x[i + 1]){++i;}}return count;
}int main()
{size_t n;while (cin >> n){vector<int> x;for (size_t i = 0; i < n; ++i){int tmp;cin >> tmp;x.push_back(tmp);}//按升序排序sort(x.begin(), x.end());cout << getLuckBox(x, n, 0, 0, 1);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wcf 例子

开发环境是vs2005 &#xff08;需要安装对wcf和wpf的扩展支持&#xff09;。1建立控制台应用程序作为服务端。///这是接口[ServiceContract(Namespace "http://Microsoft.ServiceModel.Samples")]public interface ICalculator{[OperationContract]double Add(doubl…

机器学习帮助人类找到最硬的过渡金属氮化物

来源&#xff1a;中国科学杂志社摘要&#xff1a;南京大学物理学院孙建教授和王慧田教授领导的研究团队发展了机器学习加速晶体结构搜索的方法&#xff0c;并用其预测了一种超硬的钨氮化合物。机器学习算法在很多领域取得了令人瞩目的进步&#xff0c;从而广受人们关注&#xf…

WEB攻防实战篇,思维导图

转载于:https://www.cnblogs.com/sin4/archive/2012/06/16/2551603.html

二维数组按行和按列遍历的效率

按行遍历的效率大概是是按列遍历的0.5倍 在c语言中&#xff0c;数组在内存中是按行存储的&#xff0c;按行遍历时可以由指向数组第一个数的指针一直向后遍历&#xff0c;由于二维数组的内存地址是连续的&#xff0c;当前行的尾与下一行的头相邻&#xff0c;所以可以直接到下一行…

解读《自适应机器人交互白皮书》:机器人交互需要突破性技术

来源&#xff1a;机器人创新生态摘要&#xff1a;7月11日雷克大会&#xff0c;英特尔中国研究院机器人交互实验室研发总监任海兵在演讲时&#xff0c;就白皮书中的内容进行了重点解读。个人服务机器人在近年来随着人工智能的快速发展开始得到不少关注。个人服务机器人是否真正能…

最长升序子串1231

题目与解析 给定n个数字&#xff0c;在这n个数字中找出最长上升子序列。 那么什么是上升子序列呢&#xff1f; 上升子序列就是在一个数列中递增的部分&#xff0c;不一定是连续的&#xff0c;比如说 图中的24678和24679都是数列24635798的上升子序列 解题思路 就按图上2 4 …

php使用接口实现工厂设计模式

php实现工厂设计模式&#xff0c;使用接口实现&#xff0c;表面上接口没有什么用&#xff0c;因为php是类型自动转换的。实现上使用接口可以约束类的定义&#xff0c;从而实现一致的访问。 接口在php只能起到约束类的定义作用&#xff0c;虽不像c#/java那么直观&#xff0c;但基…

大数据生态圈常用组件(一):数据库、查询引擎、ETL工具、调度工具等

你的闺蜜在减肥&#xff0c;隔壁老王在练腰&#xff0c;你还不赶紧来学习 整理了当年使用过的一些&#xff0c;大数据生态圈组件的特性和使用场景&#xff0c;若有不当之处&#xff0c;请留言斧正&#xff0c;一起学习成长。 组件名属性标签特性使用场景价格成本Mysql 关系型数…

科学革命与科学教科书

来源&#xff1a;《出版科学》2018年第4期摘要&#xff1a;借助科学哲学的反思&#xff0c;加上科学家和出版人的创新实践&#xff0c;一定能够出现既能促进常规科学研究、又能为科学革命做出某些准备的新型科学教科书。《科学革命的结构》托马斯 • 库恩著&#xff0c;金吾伦、…

barcode4j

Barcode4J由Java语言编写而成&#xff0c;可以灵活的生成条形码。它采用Apache License V2.0许可&#xff0c;这使得它很容易在商业中被使用。它可以让您生成各种流行的一维和二维条码&#xff0c;包括DataMatrix 和 PDF417。以各种格式输出&#xff0c;包括SVG, EPS, bitmaps和…

浅析段错误和栈溢出

什么段 我们在学习微机原理的时候就遇到过段&#xff0c;它代表在一个可执行文件中各种的类型信息存放的地方。   正文段&#xff1a;text用于存储指令&#xff1b;   数据段&#xff1a;data用于存储已初始化的全局变量&#xff1b;   bss段&#xff1a;用来存放程序中未…

大数据生态圈常用组件(二):概括介绍、功能特性、适用场景

三更灯火五更鸡&#xff0c;正是男儿读书时。 小编整理了一些常用的大数据组件&#xff0c;使用场景及功能特性&#xff0c;希望对后浪有所帮助。 分类名称简介功能特点使用场景大数据存储HDFSHDFS是一个分布式的文件系统&#xff0c;它具有高度的容错&#xff0c;高吞吐量&am…

物联网可应用于十大行业嘛?

来源&#xff1a;亿欧智库摘要&#xff1a;近些年来&#xff0c;全球经济增长乏力&#xff0c;物联网已变成了各国经济发展的新动力。基于此&#xff0c;亿欧智库近日将发布一份新的报告《2018物联网行业应用研究报告》&#xff0c;报告总结出了物联网的十大应用行业&#xff0…

ubuntu下查看window下文本文件乱码的解决方法

在Ubuntu中&#xff0c;在英文的locate下面查看一些从window系统生成的文本文件&#xff0c;有可能用gedit打开时出现的都是乱码&#xff0c;今天用gedit -h看了一下&#xff0c;里面有一个选项是--encoding&#xff0c;于是在终端中运行 gedit --encodinggbk打开gedit&#xf…

浅析死锁

什么是死锁&#xff1f; 死锁就是两个或多个进程在执行的过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞现象&#xff0c;当进程处于这种状态时&#xff0c;如果没有外力的作用&#xff0c;这些进程都无法继续向前进行。这是操作系统层面的一个错误&#xff…

一篇文章搞懂数据仓库:三范式与反范式

少年易老学难成&#xff0c;一寸光阴不可轻。 目录 一、第一范式 二、第二范式 三、第三范式 四、反范式化 五、范式化设计和反范式化设计的优缺点 5.1 范式化 &#xff08;时间换空间&#xff09; 5.2 反范式化&#xff08;空间换时间&#xff09; 六、OLAP和OLTP中范…

2018年全球AI突破性技术TOP10

来源&#xff1a;艾瑞网摘要&#xff1a;聪明的科技公司都不再单一的专注于自己的传统业务&#xff0c;而是着眼于未来&#xff0c;不断创新技术&#xff0c;跨界融合打造一个整合的生态系统。人工智能是个高科技、宽领域、多维度、跨学科的集大成者&#xff0c;从立足大数据、…

Linux的发展

1. Linux发展史 说起Linux你可能要问Linux是从哪里来的&#xff1f;他是怎么发展的&#xff1f;   要想知道Linux&#xff0c;还得从UNIX说起。 1.1 UNIX发展的历史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊…

Hbase rowkey设计原则,热点问题

rowKey的作用 读写数据时通过 RowKey 找到对应的 Region&#xff1b;MemStore 中的数据按 RowKey 字典顺序排序&#xff1b;HFile 中的数据按 RowKey 字典顺序排序。 rowkey设计原则 唯一性&#xff1a;类似于MySQL、Oracle中的主键&#xff0c;用于标示唯一的行&#xff1b;…

MEF: MSDN 杂志上的文章(15) 拒绝【多个导出,但只用一个导入,会拒绝,但还是稳定的组合】...

http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx转载于:https://www.cnblogs.com/Ken-Cai/archive/2012/06/22/2558978.html