2017校招真题在线编程-幸运的袋子
题目描述
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
输入描述:
第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)
输出描述:
输出可以产生的幸运的袋子数
输入
3 1 1 1
输出
2 思路:好像并没有太好的方法,深度优先搜索加上适当的剪枝做出的这道题目。。。还有一点就是避免重复。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int res = 0;//全局变量返回值void dfs(int sum, int mult, int index, bool flag, vector<int> & num){//flag是用来标记与前一个数字重复时前一个数字是否被计入。若前一个被计入则当前节点可计入,也可不计入;若前一节点未被计入则当前节点也不计入。(为了防止重复。)if(index == num.size()) return; //边界处理int newsum = sum+num[index];int newmult = mult*num[index];if(index == 0){ //第一个数的时候特殊处理,若最小的数不是1直接返回0if(num[0] == 1) {dfs(newsum, newmult,index+1,true,num);dfs(sum, mult,index+1,false,num);}else{return ;}}else{if(num[index] == num[index-1]){//与前一节点重复if(flag){//true的时候当前节点分两种讨论if(newsum>newmult) {//当前节点加入是否符合要求,若符合则继续,否则直接退出(剪枝)res+=1;dfs(newsum, newmult,index+1,true,num);}dfs(sum, mult,index+1,false,num);}else{//重复且前一节点未计入,则当前也不计入dfs(sum, mult,index+1,false,num);}}else{if(newsum>newmult) {res+=1;dfs(newsum, newmult,index+1,true,num);}dfs(sum, mult,index+1,false,num);}} }int main(){int counts = 0,temp;vector<int> nums;cin>>counts;for(int i=0;i<counts;++i){cin>>temp;nums.push_back(temp);}sort(nums.begin(),nums.end());//排序有利于后续剪枝dfs(0,1,0,false,nums);cout<<res;return 0; }
看了一下网上其他同学的答案,总体思路还是相似的,但他们的好像更简洁一点。。。这里贴上其中一位的代码:
对重复元素的排除方法不一样。
#include <iostream> #include <stdlib.h> using namespace std;int n; int nums[1000];int cmp(const void * a, const void * b) {return *(int*)a - *(int*)b; }// 思路:DFS生成全组合,同时注意剪枝、避免重复组合 int findall(int nums[], int index, long sum, long multi) {int count = 0;for(int i=index; i<n; i++) {sum += nums[i];multi *= nums[i];if(sum > multi)count += 1 + findall(nums, i+1, sum, multi);else if(nums[i] == 1)count += findall(nums, i+1, sum, multi);elsebreak;sum -= nums[i];multi /= nums[i];// 跳过相等的元素,避免重复组合while(i<n-1 && nums[i]==nums[i+1])i++;}return count; }int main(int argc, char* argv[]) {while(cin >> n) {for(int i=0; i<n; i++)cin >> nums[i];// 从小到大排序qsort(nums, n, sizeof(int), cmp);cout << findall(nums, 0, 0, 1) << endl;}return 0; }
转载于:https://www.cnblogs.com/J1ac/p/9446011.html
2017校招真题在线编程-幸运的袋子相关推荐
- 牛客网——2017校招真题在线编程(pythonC++)
牛客网--2017校招真题在线编程(python&C++) 1.n个数里的最小k个 题目描述 找出n个数里最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n ...
- 阿里巴巴2017校招C++岗位在线编程题-求集合D的最大值,最小值和元素个数三者之和
题目:输入一组正整数为集合N:从N中任意取两个数求和得到集合A:从N任意取两个数求差的绝对值得到集合B:从集合A,B中各取一个数得到集合D:集合D中最大值d1,最小值d2,元素个数为ds,求d1+d2 ...
- 【网易】牛客网2019校招真题(编程题)
[网易]被3整除 [题解]打表找规律,n为3的倍数和3的倍数余2的都是可以的,3的倍数余1的数是不可以的. 1 #include<bits/stdc++.h> 2 using namesp ...
- 游戏海报——快手2019校招真题——笔试编程C/C++
ヾ(@^▽^@)ノ刷快手,也刷快手笔试题. 题目描述: 小明有26种游戏海报,用小写字母"a"到"z"表示.小明会把游戏海报装订成册(可能有重复的海报),册子可 ...
- 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!
点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...
- 安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水
安全工程师2017年真题 And here are those same salaries adjusted to San Francisco's cost of living: 以下是根据旧金山的生 ...
- 北京林业大c语言程序设计考试试题,2020年南京林业大学2017考研真题考研真题试卷及试题答案,C程序设计考研试题下载...
说明:本站提供的南京林业大学2017考研真题考研真题来源于南京林业大学研究生院,除标注有"回忆版"字样的试题外,其余均为原版扫描,权威可靠:回忆版试题由当年参加硕士研究生入学考试考 ...
- 拼多多2018年校招真题
拼多多2018年校招真题 题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出 ...
- 牛客网 2018校招真题 美团点评 K的倍数
Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...
最新文章
- 基于Struts2框架的名片管理系统
- 2016年日本信息安全市场规模分析
- Python 常用文件
- 快速批量导入庞大数据到SQL SERVER数据库(ADO.NET)
- ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
- beautifulsoup4
- html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
- C# partial 关键字的使用
- 10G 职场晋升/IT干货/生活技能/理财秘籍 【全套】学习资料免费送!
- leetcode 37. 解数独 思考分析
- git can‘t merge 的处理 代码冲突问题的解决
- 在Linux中创建静态库和动态库范例 (hello.c)
- WordPress Exploit Scanner插件安全绕过漏洞
- 二维波动方程matlab,二维波动方程matlab
- TextView常用属性
- 【项目】#防翟天临老师翻车神器# ——实现文本查重
- Zotero-word中引用跳转到参考文献/建立超链接-引用格式(Xie et al 2021, Achanta et al 2012)
- 按颜色分类:青绿色系(Blue Green)
- 【Exception】Class com.XXX1 can not access a member of class com.XXX2 with modifiers “public“
- mysql没有exe_MySQL解压之后没有exe程序,怎么解决,怎么安装访问