题目描述

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

输入描述:

第一行输入一个正整数n(n ≤ 1000)
第二行为n个数正整数xi(xi ≤ 1000)

输出描述:

输出可以产生的幸运的袋子数
示例1

输入

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校招真题在线编程-幸运的袋子相关推荐

  1. 牛客网——2017校招真题在线编程(pythonC++)

    牛客网--2017校招真题在线编程(python&C++) 1.n个数里的最小k个 题目描述 找出n个数里最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n ...

  2. 阿里巴巴2017校招C++岗位在线编程题-求集合D的最大值,最小值和元素个数三者之和

    题目:输入一组正整数为集合N:从N中任意取两个数求和得到集合A:从N任意取两个数求差的绝对值得到集合B:从集合A,B中各取一个数得到集合D:集合D中最大值d1,最小值d2,元素个数为ds,求d1+d2 ...

  3. 【网易】牛客网2019校招真题(编程题)

    [网易]被3整除 [题解]打表找规律,n为3的倍数和3的倍数余2的都是可以的,3的倍数余1的数是不可以的. 1 #include<bits/stdc++.h> 2 using namesp ...

  4. 游戏海报——快手2019校招真题——笔试编程C/C++

    ヾ(@^▽^@)ノ刷快手,也刷快手笔试题. 题目描述: 小明有26种游戏海报,用小写字母"a"到"z"表示.小明会把游戏海报装订成册(可能有重复的海报),册子可 ...

  5. 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...

  6. 安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水

    安全工程师2017年真题 And here are those same salaries adjusted to San Francisco's cost of living: 以下是根据旧金山的生 ...

  7. 北京林业大c语言程序设计考试试题,2020年南京林业大学2017考研真题考研真题试卷及试题答案,C程序设计考研试题下载...

    说明:本站提供的南京林业大学2017考研真题考研真题来源于南京林业大学研究生院,除标注有"回忆版"字样的试题外,其余均为原版扫描,权威可靠:回忆版试题由当年参加硕士研究生入学考试考 ...

  8. 拼多多2018年校招真题

    拼多多2018年校招真题 题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出 ...

  9. 牛客网 2018校招真题 美团点评 K的倍数

    Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...

最新文章

  1. 基于Struts2框架的名片管理系统
  2. 2016年日本信息安全市场规模分析
  3. Python 常用文件
  4. 快速批量导入庞大数据到SQL SERVER数据库(ADO.NET)
  5. ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
  6. beautifulsoup4
  7. html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
  8. C# partial 关键字的使用
  9. 10G 职场晋升/IT干货/生活技能/理财秘籍 【全套】学习资料免费送!
  10. leetcode 37. 解数独 思考分析
  11. git can‘t merge 的处理 代码冲突问题的解决
  12. 在Linux中创建静态库和动态库范例 (hello.c)
  13. WordPress Exploit Scanner插件安全绕过漏洞
  14. 二维波动方程matlab,二维波动方程matlab
  15. TextView常用属性
  16. 【项目】#防翟天临老师翻车神器# ——实现文本查重
  17. Zotero-word中引用跳转到参考文献/建立超链接-引用格式(Xie et al 2021, Achanta et al 2012)
  18. 按颜色分类:青绿色系(Blue Green)
  19. 【Exception】Class com.XXX1 can not access a member of class com.XXX2 with modifiers “public“
  20. mysql没有exe_MySQL解压之后没有exe程序,怎么解决,怎么安装访问

热门文章

  1. Cassandra--启用用户认证和用户管理
  2. Sqlserver中 登录用户只能看到自己拥有权限的库
  3. 我的第三个jquery插件——promptForK13内容提示插件
  4. linux下51单片机开发解决方案
  5. 在Hi3531上运行QT
  6. Tomcat多实例和负载均衡
  7. requests.get(url)执行没反应_翟至宇:执行路上,从未停歇
  8. python 用if判断一个数是不是整数_五天学会Python基础02(下)
  9. python可以在unix_在python窗口中使用绝对的unix路径
  10. 解析网络诊断利器SreCli-Net