网易--幸运的袋子

2024-04-13 01:48
文章标签 网易 幸运 袋子

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

题目描述

一个袋子里面有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

思路一

最开始想的是回溯(DFS),结果超时了,因为会存在重复的计算。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;public class Main{private static int res = 0;public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();int nums[] = new int[n];//boolean[] seen = new boolean[n];for(int i = 0;i < n;i++) nums[i] = in.nextInt();Arrays.sort(nums);backtrack(nums, new ArrayList<Integer>(), 0);System.out.println(res);}private static void backtrack(int[] nums, ArrayList<Integer> list, int start){if(list.size() >= 2){if(isLucky(list)) res++;}for(int i = start;i < nums.length;i++){if(i > start && nums[i] == nums[i - 1]) continue;list.add(nums[i]);//seen[i] = true;backtrack(nums, list, i + 1);list.remove(list.size() - 1);//seen[i] = false;}}private static boolean isLucky(ArrayList<Integer> list){int sum = 0;int product = 1;for(int i : list){sum += i;product *= i;}return sum > product;}
}

这里写图片描述

思路二

题目可以转化成求符合条件的集合真子集个数。每次从全集中选择若干元素(小球)组成子集(袋子)。集合子集个数为2^n个,使用dfs必然超时。且此题有重复元素,那么就搜索剪枝。
对于任意两个正整数a,b如果满足 a+b>a*b,则必有一个数为1.可用数论证明:
设a=1+x,b=1+y,则1+x+1+y>(1+x)*(1+y),—> 1>x*y,则x,y必有一个为0,即a,b有一个为1.
推广到任意k个正整数,假设a1,a2,…ak,如果不满足给定条件,即和sum小于等于积pi,
如果此时再选择一个数b,能使其满足sum+b > pi*b,则,b必然为1,且为必要非充分条件。
反之,如果选择的b>1,则sum+b <=pi*b,即a1,a2,…,ak,b不满足给定条件。(搜索剪枝的重要依据)

因此,将球按标号升序排序。每次从小到大选择,当选择到a1,a2,…,ak-1时满足给定条件,而再增加选择ak时不满足条件(ak必然大于等于max(a1,a2,…,ak-1)),继续向后选择更大的数,必然无法满足!因此,可以进行剪枝。
如果有多个1,即当k=1时,sum(1)>pi(1)不满足,但下一个元素仍为1,则可以满足1+1>1*1,所以要判断当前ak是否等于1.
此外,对于重复数字,要去重复。

参考自:牛客网 – 小刀初试

#include<iostream>
using namespace std;//冒泡排序
void sort(int *a,int n)
{int temp=0;for(int i=0;i<n;i++){   temp=a[i];for(int j=i;j<n;j++){if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}}
}
int count(int a[],int n,int pos,long long sum,long long mul)
{int num=0;for(int i=pos;i<n;i++){   sum+=a[i];mul*=a[i];if(sum>mul)num+=1+count(a,n,i+1,sum,mul);elseif(a[i]==1)  //几个连续1的情况,或者说以1开头的情况num+=count(a,n,i+1,sum,mul);elsebreak;sum-=a[i];mul/=a[i];for(;i<(n-1)&&(a[i]==a[i+1]);) //跳过重复的数字i++;}return num;}   
int main()
{int n;cin>>n;int a[n];for(int i=0;i<n;i++)cin>>a[i];sort(a,n);long long sum=0,mul=1;cout<<count(a,n,0,sum,mul)<<endl;}

这篇关于网易--幸运的袋子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

猫猫学iOS(四十七)之网易彩票帮助界面UIWebView的运用

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 制作过程 首先是帮助按钮那个地方的点击。 这里是用点击跳转的用的是 NJSettingArrowItem,前面的设置的,从字典通过模型转过来的。 // 分享NJSettingArrowItem

(素材源码)猫猫学iOS(四十六)之网易彩票幸运大转盘

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 素材源码地址:http://download.csdn.net/detail/u013357243/8713827 效果 代码: NYWheel NYWheel.h //// NYWheel.h//

猫猫学iOS(四十六)之网易彩票幸运大转盘

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 素材源码地址:http://blog.csdn.net/u013357243/article/details/45828841 效果 实现过程: 基础UI搭建 这里主要是用了xib搭建,首先我们分析,有中间的开

猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一下操作。 代码: 话不多说,先

面试二(Tencent网易面试题)

面试提问: JS是怎么运行的? 自己怎么写个小游戏<使用Canvas/主循环how实现>? 开放数据咋跑起来? 面试题: 指针函数和函数指针区别, Queue底层数据结构, 地图怎么处理,label描边怎么实现(边缘检测…). A*算法 搭过什么框架 网络协议用什么 微信小游戏是一个不同于浏览器的 JavaScript 运行环境,没有 BOM 和 DOM API 网络: 总结下面试中常遇

网易2017秋招编程题集合--完全解析

前言 一些大公司的真题里面总有些含金量很高的几个题,网易2017秋招编程题集合里面也有几个题是非常好的,比如说第三题跳石板,第四题黑暗的字符串都是很好的题目。特别是第四题的那种思路之前几乎完全没有接触过,还有第六题最大的奇约数里面还有部分数学思维在里面。 1.回文序列 题目描述:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {1, 2, 1}, {15, 7

网易2016研发工程师编程题--完全解析

前言 之前做公司的真题,碰到动态规划,还有一些数学性质的题目比较多一点。网易2016研发工程师编程题跟之前做的题目有很大的不同,不仅涉及到二叉树的编码,还涉及到图的广度遍历,最后还有一个快排。可以说这次的三个题目含金量非常的高,因此做了一下总结和分析。 1.比较重量 题目描述:小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间

【网易笔试】

小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂画棋盘。小易会找出棋盘中某一列中拥有相同颜色的最大的区域去涂画,帮助小易算算他会涂画多少个棋格。  输入描述: 输入数据包括n+1行:第一行为一个整数n(1 ≤ n ≤ 50),即棋盘的大小接下来的n行每行一个字符串表示第i行棋盘的颜色,'W'表示白色,'B'表示黑色 输出描述: 输出小易会涂画的

【网易笔试】小易最近在数学课上学习到了集合的概念

/***************************************************** 小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性. 小易的老师给了小易这样一个集合: S = { p/q | w ≤ p ≤ x, y ≤ q ≤ z } 需要根据给定的w,x,y,z,求出集合中一共有多少个元素。小易才学习了集合还解决不了这个复杂