网易--幸运的袋子

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

相关文章

从网易校招编程题谈起,轻松理解有趣的0-1背包问题

从网易的一道算法题开始 最近在准备春招实习,偶然做到网易的一道编程题,一方面找了很多博客看的云里雾里,这里特别写下解题的思路和逻辑,一方面加深印象,另一方面供需要的你学习参考。好了,话不多说,开始吧。本文提供思路,并给出Java代码实现例子,供大家参考。 先睹为快 来源:网易2017春招笔试真题编程题 时间限制:1秒 空间限制:32768K 一种双核CPU的两个核能够同时的处理任务,现在有

网易:从邮箱服务到多元化互联网业务的跨越式发展

网易,这个在中国互联网发展史上留下浓墨重彩一笔的名字,自1997年由丁磊先生创立以来,已经走过了二十余载的风雨历程。从最初的一家单纯的邮箱服务提供商,到如今涵盖游戏、电商、教育、音乐等多个领域的综合性互联网巨头,网易的成长轨迹不仅映射出中国互联网行业的蓬勃发展,也彰显了其自身不懈的创新精神和卓越的市场洞察力。 网易的起点并不显赫,却充满了创新的火花。在那个互联网刚刚起步的时代,网易邮箱凭借其

网易实习--编程题

网游中,装备强化是提升角色战力的常见方法。 现在你参与开发的游戏中也有这项功能,团队正在设计每件装备强化所能提升的战力及需要消耗的金币数。为了设计出一个合理的强化系统,决定先做一些强化模拟测试,而你现在就在是该模拟程序的开发者。 假设现在有n件可以同时穿戴的装备,对于第i件装备,最多可以强化mi 次,对于第i件装备的第j次强化,会增加fij 的战力,并需要消耗gij 个金币。现在给出所有装备的数

网易数字游戏

#include<bits/stdc++.h>using namespace std;int main(){int n;int a[30];while(cin>>n){for(int i=0;i<n;i++)cin>>a[i];sort(a,a+n);int b=0;for(int i=0;i<n;i++){if(a[i]>b+1)break;b+=a[i];}cout<<b+1<<endl;

网易构造队列

#include<bits/stdc++.h>using namespace std;int main(){int T;cin>>T;while(T--){int n;cin>>n;vector<int>v;queue<int>Q;int i,j;for(i=0; i<n; i++)Q.push(i);while(!Q.empty()) //队列不空,执行循环{in

2004年 联想员工亲历联想大裁员:公司不是我的家 (网易裁员事件相关文章)

今天,恐怕是联想历史上规模最大的一次大裁员。我们部门9个人,今天送走了三个,还有三个要转岗,剩下三个。整个研究院走了30多人,转岗20多人。这是我经历的第二次所谓战略性调整,有很多感触,却又好像什么都堵在心里,说不出来。干脆简单记录下这段往事,提醒自己。     [联想精细化裁员]      昨天晚上,研究院秘密召开紧急会议。有20多位“责任经理”参加,我才清楚了整个裁员过程。3月6日启动计

网易2017春招笔试 分饼干

易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值 输入描述: 输入包括两行: 第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位) 第二行为小朋友的人数n 输出描述: 输出k可能的数值种数

Llinux下安装网易云和QQ

Linux下安装软件对一个新手来说并不容易,下面来讲讲安装网易云和QQ的简单操作: (1)安装网易云音乐:下载地址点击打开链接 方法:在ubuntu的控制台命令窗口输入命令:sudo dpkg -i netease-cloud-music_1.0.0_amd64_ubuntu16.04.deb 会出现依赖问题 输入:sudo apt-get install -f重新输入上个命令

用Python制作幸运大转盘,抽奖转盘对比-tkinter(Python的内置GUI库)和pygame(一个更强大的游戏和多媒体应用库)——小白也能轻松看懂

一、要制作一个幸运大转盘(抽奖转盘)的Python程序,你可以使用图形库如tkinter(Python的内置GUI库)或者pygame(一个更强大的游戏和多媒体应用库)。由于tkinter更为简单和直接,以下是一个基本的tkinter实现的例子: import tkinter as tk from tkinter import Canvas, Button, Tk import rand

幸运小猫爱心平台设计文档

这是一个关于Java高级程序设计实训的题目,名为“幸运小猫爱心平台”。该平台的目标是规范校园内的流浪猫管理,并允许用户查阅、搜索、发布或领养宠物。下面将提供一个简单的系统设计文档,以帮助您更好地理解如何实现这个项目。 幸运小猫爱心平台设计文档 1. 引言 本设计文档旨在为“幸运小猫爱心平台”的开发提供详细的指导方案。系统旨在提供一个全面的流浪猫管理平台,支持用户注册、登录、浏览、搜索、发布和