day29—编程题

文章目录

  • 1.第一题
    • 1.1题目
    • 1.2涉及的相关知识
    • 1.3思路
    • 1.4解题
  • 2.第二题
    • 2.1题目
    • 2.2思路
    • 2.3解题

1.第一题

1.1题目

描述:
居然有假币! 现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。nowcoder这就去买猪肉,结果找来的零钱中有假币!!!可惜nowcoder 一不小心把它混进了一堆真币里面去了。只知道假币的重量比真币的质量要轻,给你一个天平(天平两端能容纳无限个硬币),请用最快的时间把那个可恶的假币找出来。
输入描述:
1≤n≤2^30,输入0结束程序。
输出描述:
最多要称几次一定能把那个假币找出来?

1.2涉及的相关知识

ceil() 方法可对一个数进行上舍入,返回值大于或等于给定的参数,类型为双精度浮点型。
语法:该方法有以下几种语法格式:double ceil(double d);double ceil(float f)
参数:double 或 float 的原生数据类型。
返回值:返回 double 类型,返回值大于或等于给定的参数。

1.3思路

将假币分成三份,对其中的两份进行称重知道币的数量小于2

1.4解题

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n;
        while ((n = sc.nextInt()) != 0) {
            int count = 0;
            //将假币分成三份进行称重
            while(n >= 2){
                n = (int) Math.ceil((double)n/3);
                count++;
            }
            System.out.println(count);
        }
    }
}

2.第二题

2.1题目

描述:
给定一个全是正数的数组arr,定义一下arr的最小不可组成和的概念: 1,arr的所有非空子集中,把每个子集内的所有元素加起来会出现很多的值,其中最小的记为min,最大的记为max; 2,在区间[min,max]上,如果有一些正数不可以被arr某一个子集相加得到,那么这些正数中最小的那个,就是arr的最小不可组成和; 3,在区间[min,max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和; 举例: arr = {3,2,5} arr的min为2,max为10,在区间[2,10]上,4是不能被任何一个子集相加得到的值中最小的,所以4是arr的最小不可组成和; arr = {3,2,4} arr的min为2,max为9,在区间[2,9]上,8是不能被任何一个子集相加得到的值中最小的,所以8是arr的最小不可组成和; arr = {3,1,2} arr的min为1,max为6,在区间[2,6]上,任何数都可以被某一个子集相加得到,所以7是arr的最小不可组成和; 请写函数返回arr的最小不可组成和。

2.2思路

  1. 本题采用动态规划求解
  2. 先找到最大和最小子集
  3. 再把能满足的子集和找到arr[i]=j,再递推,如果f(j-arr[i]) = true,那么对arr[i]来说,满足f(j) = true
  4. 从最小值开始遍历,看是否能得到,不能就输出,都找到了就输出最大值+1

2.3解题

import java.math.*;
public class Solution {
	/**
	 *	正数数组中的最小不可组成和
	 *	输入:正数数组arr
	 *	返回:正数数组中的最小不可组成和
	 */
	public int getFirstUnFormedNum(int[] arr) {
		int min = Integer.MAX_VALUE;//最小子集
		int max = 0;//最大子集
		for(int i = 0;i < arr.length;i++){
			min = Math.min(min,arr[i]);
			max += arr[i];
		}
		boolean[] form = new boolean[max + 1];
		form[0] = true;
		for(int i = 0;i < arr.length;i++){
			for(int j = max;j >= arr[i];j--){
				form[j] = form[j - arr[i]] || form[j];
			}
		}
		//从最小值开始遍历,看是否能得到,不能就输出
		for(int i = min;i < form.length;i++){
			if(!form[i]){
				return i;
			}
		}
		//都找到了就输出最大值+1
		return max+1;
	}
}

你可能感兴趣的:(每日一题,java,算法,数据结构)