当前位置: 首页 > article >正文

day14—编程题

文章目录

  • 1.第一题
    • 1.1题目
    • 1.2思路
    • 1.3解题
  • 2.第二题
    • 2.1题目
    • 2.2思路
    • 2.3解题

1.第一题

1.1题目

描述:
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天

1.2思路

  1. 定义一个数组存放每个月对应的天数
  2. 用输入的day数加上每个月对应的天数

1.3解题

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int year = sc.nextInt();
        int month = sc.nextInt();
        int day = sc.nextInt();
        int sum = 0;
        int[] array = {31,59,90,120,151,181,212,243,273,304,334,365};
        //由于数组的下标是从0开始的,所以每一个月对应的下边应该是本月的月份减去2
        if(month >=2){
            sum += array[month - 2];
        }
        sum += day;
        //只有当月份大于2才用考虑要不要加一天的问题
        if(month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){
            sum += 1;
        }
        System.out.println(sum);
    }
}

2.第二题

2.1题目

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

2.2思路

  1. 先将球按照上面的数字放在数组中,将球按照上面的数字进行排序
  2. 当sum的值大于multi的时候,让幸运袋子的数目加1并且继续看后面的球是否可以和前面的球继续组成幸运袋子
  3. 特殊情况array[i]==1:继续看后面的球是否可以和前面的球继续组成幸运袋子,因为1和任何数的和都大于它和任何数的积
  4. 当一个球无法和前面的的球组成幸运的袋子,就直接break,因为和后面的球一定无法组成幸运的袋子
  5. 当当前的球无法和后面的球构成幸运袋子的时候,需要判断后面是否还有和当前的球相等的球,由于球都是一样的,避免重复判断

2.3解题

import java.util.*;
public class Main {
    //产生幸运袋子的数目
    //array中存放的是球的号码数,pos是遍历的起始位置,sum是和,multi是积
    public static int count(int[] array, int pos, int sum, int multi) {
        int ret = 0;
        for (int i = pos; i < array.length; i++) {
            sum += array[i];
            multi *= array[i];
            if (sum > multi) {
                //当sum的值大于multi的时候,让幸运袋子的数目加1并且继续看后面的球是否可以和前面的球继续组成幸运袋子
                ret = ret + 1 + count(array, i + 1, sum, multi);
            } else if (array[i] == 1) {
                //特殊情况array[i]==1:继续看后面的球是否可以和前面的球继续组成幸运袋子,因为1和任何数的和都大于它和任何数的积
                ret = ret + count(array, i + 1, sum, multi);
            } else {
                //当一个球无法和前面的的球组成幸运的袋子,就直接break,因为和后面的球一定无法组成幸运的袋子
                break;
            }
            //当返回上层递归的时候,需要回溯,继续计算前面的号码和当前位置后面的号码是否可以构成幸运的袋子
            sum -= array[i];
            multi /= array[i];
            //当当前的球无法和后面的球构成幸运袋子的时候,需要判断后面是否还有和当前的球相等的球,由于球都是一样的,避免重复判断
            while (i < array.length - 1 && array[i] == array[i + 1]) {
                i++;
            }
        }
        return ret;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] array = new int[n];
        for (int i = 0; i < array.length; i++) {
            array[i] = sc.nextInt();
        }
        Arrays.sort(array);
        int ret = count(array, 0, 0, 1);
        System.out.println(ret);
    }
}

http://www.kler.cn/a/6510.html

相关文章:

  • 微服务分布式(二、注册中心Consul)
  • 【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对
  • 【day11】面向对象编程进阶(继承)
  • Nginx - 负载均衡及其配置(Balance)
  • 机器学习基础算法 (二)-逻辑回归
  • LabVIEW伸缩臂参数监控系统
  • JVM垃圾回收——ZGC垃圾收集器
  • 【算法】树状数组维护总结
  • 计算机底层:循环冗余校验码CRC
  • 实验十八、测量运放的开环差模放大倍数
  • 实验二 配置Trunk和链路汇聚
  • 近世代数 笔记与题型连载 第八章(置换群)
  • Linux之进程替换
  • Octree(八叉树)
  • 【进阶C语言】指针和数组笔试题解析
  • 愚人节,聊聊那些正在坑人的“新型AI”
  • 实验5 数字图像基础
  • python函数
  • 【Python入门第四十六天】Python丨NumPy 数组重塑
  • 关于分布式系统缓存扩容的一些总结(面试装逼能用实际也很有用)
  • 【机器学习算法实践】GBDT提升树,集成学习boosting方法,可分类课可回归,CART树是基础,调参是重点
  • 第十四届CCPC吉林省赛题解
  • 20230405英语学习
  • 溯源取证-钓鱼取证 基础篇
  • NDK RTMP直播客户端一
  • Android事件分发机制小结