牛客WY15 幸运的袋子 C++实现

2023-10-21 02:36

本文主要是介绍牛客WY15 幸运的袋子 C++实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 幸运的袋子

 袋子里的数字和大于数字积,才会是一个幸运的袋子。从这句话中,我们可以得到一个消息,也就是袋子里的数字必须要有1(因为是袋子里全是正整数)。

由这个条件,我们很容易想到先进行排序,再来看袋子是否幸运。

那么我们是要排升序还是降序呢?

升序是一个个的加且乘过去,幸运就+1,直到不幸运就返回重新来,将前面的第一个1删除掉,从第二位位置继续往后面算。

降序除非数据全是1,否则第一次就不幸运。那么你得全部遍历完才能算出结果。

因此我们选择升序会好处理很多。 

那么我们可以先写出如下代码,后续再处理幸运的问题。

int main() {int n = 0;cin>> n;vector<int> v;v.reserve(n);for(int i=0;i<n;i++){int j = 0;cin>>j;v.push_back(j);}sort(v.begin(), v.end());}

处理幸运,我们应该得想到回溯 

第一次计算,我们很容易算到上面这个数据。

  1 1 2 2 3 不在幸运后,我们就需要回退了,直接break跳出该次递归。

回到1 1 2 2 的位置,因为数据是有序的,后面不可能再次出现幸运了,我们应该去掉最后一个。就变成了1 1 2的情况了。

位置在第二个2的情况我们已经计算过了,那我们现在要走到3。

数据为 1 1 2 3。再来判断是否幸运,一直重复上述步骤。

有了思路,我们开始写代码。


想想参数需要什么,vector里的内容是必须的,还需要pos,代表当前走到的位置,当前袋子之和,还有袋子之积也是不可获取的。那么我们可以定义如下函数

int luckybag(const vector<int>& v, int pos, int sum, int mul)

 进行循环遍历,计算当前位置(pos)的sum和mul。

如果sum>mul,就先加1在去递归。

不幸运 如果v[i]==1,这个是数据只有一个 1 的情况,也是去递归。不用+1,因为不满足幸运

现在还不幸运,就直接break,数据返回进行回溯。

将当前算的sum和mul减掉(当前的数据已经计算完毕,再往后面添加数据已经不满足幸运条件了,因此要把尾部数据删除掉,再去计算后面数据是否幸运)

最后由于相同号码的球是无区别的,因此需要去重,通过while循环防止重复问题。

int luckybag(const vector<int>& v, int pos, int sum, int mul)
{int count = 0;for (int i = pos; i < v.size(); i++){sum += v[i];mul *= v[i];//只有数据有1的时候才可能sum>mulif (sum > mul)count += 1 + luckybag(v, pos + 1, sum, mul);else if (v[i] == 1)//如果不幸运,并且当前值为1(数据只有1才会这样)count += luckybag(v, pos + 1, sum, mul);elsebreak;sum -= v[i];mul /= v[i];//处理重复问题while (i < v.size() - 1 && v[i] == v[i + 1]){i++;}}return count;
}

总代码 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int luckybag(const vector<int>& v, int pos, int sum, int mul)
{int count = 0;for (int i = pos; i < v.size(); i++){sum += v[i];mul *= v[i];//只有数据有1的时候才可能sum>mulif (sum > mul)count += 1 + luckybag(v, pos + 1, sum, mul);else if (v[i] == 1)//如果不幸运,并且当前值为1(数据只有1才会这样)count += luckybag(v, pos + 1, sum, mul);elsebreak;sum -= v[i];mul /= v[i];//处理重复问题while (i < v.size() - 1 && v[i] == v[i + 1]){i++;}}return count;
}
int main() {int n = 0;cin>> n;vector<int> v;v.reserve(n);for(int i=0;i<n;i++){int j = 0;cin>>j;v.push_back(j);}sort(v.begin(), v.end());cout<<luckybag(v,0,0,1);
}

 这种回溯题还是很难的,需要多多训练,如果实在难以理解,可以将代码复制到本地编译器中,进行调试,(还可以加上画递归展开图)一步一步看结果。

这篇关于牛客WY15 幸运的袋子 C++实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251359

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima