Java练习题第二十七期:幸运的袋子

news2025/7/9 8:52:18

作者:有只小猪飞走啦
博客地址:

文章目录

  • 前言
  • 一,题目
  • 二,解析
  • 三,代码

前言

本博客是小博主在做Java算法题的过程中一些觉得可以分享的题目,希望对你们有帮助,如果哪里写错了或者有更好的解法,都可以私聊我哈!我和你一起探讨!

一,题目

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

二,解析

每次从全集中选择若干元素(小球)组成子集(袋子)。对于任意两个正整数a,b如果满足 a+b>ab,则必有一个数为1.可用数论证明:设a=1+x,b=1+y,则1+x+1+y>(1+x)(1+y),—> 1>xy,则x,y必有一个为0,即a,b有一个为1.推广到任意k个正整数,假设a1,a2,…ak,如果不满足给定条件,即和sum小于等于积pi。如果此时再选择一个数b,能使其满足sum+b > pib,则,b必然为1,且为必要非充分条件。反之,如果选择的b>1,则sum+b <= pib,即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,如果等于1,虽然不能满足,组合的个数不能增加,但是继续向后搜索,仍然有满足条件的可能.对于重复数字,组合只能算一个,要去重。
在这里插入图片描述

三,代码

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0 ; i< n ; i++){
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        System.out.println(count(arr,n,0,0,1));
    }
    public static int count(int[] arr,int n ,int pos , int sum , int multi){
        int count=0;
        for(int i = pos ; i<n ; i++){
            sum += arr[i];
            multi *= arr[i];
            if(sum>multi){
                count = count + 1 + count(arr , n , i+1 , sum , multi);
            }else if(arr[i] == 1){
                count = count + count(arr, n ,i+1 ,sum , multi);
            }else{
                break;
            }
            sum -= arr[i];
            multi /=arr[i];
            while(i+1<n &&arr[i] == arr[i+1]){
                i++;
            }
        }
        return count;
    }
}

牛客网运行结果:
在这里插入图片描述
这期博客就到此结束了,希望对你有帮助!
关注小猪,小猪带你一起学习!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解Unity中的Nav Mesh新特性|导航寻路系统 (一)

前言 之前我们讲解过Unity的Nav Mesh系统&#xff0c;其中提到过这个新版的Nav Mesh&#xff0c;它解决现有Nav Mesh的几个缺陷&#xff0c;比如无法动态烘焙&#xff0c;无法按照Agent的半径和高度适当的判断可行路径。现在新版Nav Mesh可以彻底解决这个问题&#xff01;某种…

实验送样、数据分析样品、组名命名规范

俗话说巧妇难为无米之炊&#xff0c;而样品就是“米”&#xff0c;没有样品&#xff0c;就无法开展实验&#xff0c;无法获得数据&#xff0c;无法毕业&#xff0c;无法发文章。鉴于样品的重要性&#xff0c;非常有必要对样品进行详细且规范的记录&#xff0c;方便他人也方便自…

Java 线上机器 CPU 100 的一次排查过程

文章目录1. 问题发生2. 数据库连接关闭问题排查3. 问题的进一步排查4. 解决方法1. 问题发生 日常敲代码突然收到生产环境异常告警&#xff0c;线上有一台机器 CPU 使用率飙升到 100 触发扩容&#xff0c;工作群里一下子鸡飞狗跳。 出现问题&#xff0c;首先当然是查看监控和日…

在群晖NAS上搭建导航页_通过Web Station搭建

一、业务需求 1.1、需求说明 我们在使用群晖NAS的过程中&#xff0c;随着时间的推移会安装各种各样的软件内容和管理工具&#xff0c;而这些内容又都是一些网页界面&#xff08;特别是一些在Docker中搭建的工具&#xff09;时间久了我们也记不住那么多工具的Web界面地址&#…

激活Windows时出现错误代码0xC004C003怎么办?

Windows是我们最常见的电脑操作系统&#xff0c;那么如果我们在尝试激活Windows时出现错误代码0xC004C003&#xff0c;应该如何解决&#xff1f; 什么是Windows激活错误0xC004C003&#xff0c;出现该错误的原因是什么&#xff1f; Windows操作系统为了抑制盗版软件&#xff0c…

3D建模就业前景如何?加班多吗?值不值得入行

加班其实都还好&#x1f914;&#xff0c;因为这个岗位是按照项目进度考核&#xff08;算钱&#xff09;的&#xff0c;老手做一个模型要5,6个小时&#xff0c;新手可能需要10个小时&#xff0c;新人刚入行&#xff0c;做东西效率跟不上&#x1f630;需要加班来弥补是肯定有的事…

SpringMVC-整合详解

SpringMVC-整合详解 MVC 什么是MVC? 它是一种开发模式&#xff0c;它是模型视图控制器的简称。所有的web应用都是基于MVC开发的 M: 模型层&#xff0c;它是模型视图控制器的简称。所有的web应用都是基于MVC开发 V: 视图层,html、javascript、vue等都是视图层&#xff0c;用…

高校实验室设备管理系统设计与实现-计算机毕业设计源码+LW文档

数据库代码&#xff1a; /* Navicat MySQL Data Transfer Source Server : mysql5 Source Server Version : 50562 Source Host : localhost:3306 Source Database : ssmgxsyssbglxthsg3511cg ​ Target Server Type : MYSQL Target Server Versio…

Linux磁盘分区和管理

文章目录一 添加硬盘&#xff0c;创建Linux分区1.首先准备一块新的硬盘2.检查系统是否识别了硬盘3.对磁盘进行分区3-1 创建MBR磁盘分区3-2 创建文件系统3-3 挂载文件系统二 创建交换空间2-1 创建分区2-2 设置分区类型2-3 格式化交换空间2-4 激活交换空间三 删除磁盘的分区3-1 备…

【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(CUDA-Aware MPI)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

11.24直播预告 | AIGC,看热闹不如看门道

如果把AI比作既富含能源&#xff0c;又无限神秘的海域&#xff0c;那么AIGC这条近半年内流经学术界和创投圈的支流&#xff0c;也无疑既带来了无数机遇&#xff0c;又蕴藏未知风险。 几天前&#xff0c;将门-TechBeat社区的专题&#xff08;《AIGC的八大前沿创新》&#xff09;…

Allegro基本规则设置指导书

Allegro基本规则设置指导书 下面介绍基本规则设置指导书之Analysis Modes 点击set-up-constrains-Modes 调出Analysis Modes,这个是所有DRC的总开关 下面介绍常用的一些开关设置 Design Options (Soldermask) 从上往下 阻焊到阻焊的间距 阻焊到pad和走线间距 阻焊到shape…

leecode #加一#二进制求和

题目描述&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 分析&#xff1a;对数…

简单版的采用前后端分离模式实现SpingBoot新增查询功能

目录 后端代码编写 前端代码编写 首页展示&#xff1a; 新增&#xff1a; 开发工具&#xff1a;IDEA、HbuilderX 技术点&#xff1a;后端&#xff1a;SpringBoot&#xff0c;前端&#xff1a;ElementUIvue,采用前后端分离模式实现。 后端代码编写 目录&#xff1a; 代码…

多线程高并发笔记

一、基础知识 1. 线程打断的三种方法 interrupt() 打断某个线程&#xff08;其实只是设置一个标志位&#xff09;isInterrupted() 查询某线程是否被打断过&#xff08;查询是否设置了标志位&#xff09;static interrupted() 查询当前线程是否被打断过&#xff0c;并重置打断…

计算机毕业设计ssm+vue基本微信小程序的今日菜谱系统

项目介绍 谈到外出就餐,我们除了怕排队,也怕这家餐厅的服务员不够用,没人为我们点餐,那么一餐饭排队一小时,点餐恐怕也要花个半小时,这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面的影响,所以开发今日菜谱微信小程序系统是必须也是必然的。 本系统采用微…

vue2 sass 安装及使用

最近在看前端。其一因为手里有个项目uniapp的里面使用了sass&#xff0c;但是有sass报错&#xff0c;其次想自己写个vue2后台&#xff0c;感觉sass写起来科学点。但是……版本这个东西……太费劲了…… vue2-cli集成webpack&#xff0c;使用vue create 项目名后再安装sass相当…

C++程序设计期末考试复习试题及解析 3(自用~)

DDL1.题目及分析1.对象数组的析构顺序2.浅拷贝的隐患delete p 还是 delete[]p ?类似的题&#xff0c;自行查阅3.常数据成员的初始化4.默认构造函数5.cin、cout所属类6.重载7.静态数据成员8.多态8.联编9.内联函数10.引用11.static12.构造Complex类13.静态成员函数14.抽象类15.标…

[一篇读懂]C语言二讲:运算符与表达式

[一篇读懂]C语言二讲&#xff1a;运算符与表达式1. 算术运算符与关系运算符1 运算符分类2 算术运算符及算术表达式3 关系运算符与关系表达式【例】关系运算符的使用。4 运算符优先级2. 逻辑运算符与赋值运算符&#xff0c;求字节运算符1 逻辑运算符与逻辑表达式【例】逻辑运算符…

k8s基于kubectl命令管理资源并分配

文章目录一、资源管理介绍二、资源管理方式1、命令式对象管理2、命令式对象配置3、声明式对象配置一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过master节点操作资源来管理kubernetes。 &#xff08;1&#xff09;kubernetes的本…