蓝桥冲刺31天,第十一天java题解

目录

一、天干地支

解析:

二、包子凑数

解析:

三、求值

解析:

四、青蛙跳杯子

昨天dfs,今天bfs,小怂不会,正在强行理解!!!


一、天干地支

 

解析:

可以简单爆算,毕竟给的值为1-9999,数值不大;

还有一种就是 计算连个年份的时间差后,分别模10和模12,当然要注意这个年份比当前年份小的情况,具体代码如下:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String []arr={"geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"};
        String []brr={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
        int a=0;//记录天干
        int b=0;//记录地支
        int n=scan.nextInt();
        a=Math.abs(n-2020)%10;
        b=Math.abs(n-2020)%12;
        if(n>=2020){
          System.out.println(arr[a]+brr[b]);
        }else{
          System.out.println(arr[(10-a)%10]+brr[(12-b)%12]);
        }
        scan.close();
    }
}

二、包子凑数

 

解析:

这题和前面的一题:买不到的数 非常相像

通过买不到的数我们知道:两个互质数买不到的最大值为 a*b-a-b;

而包子凑数不过是把原定给的2种变成了1-100种,并且多了一个无解情况;

我们怎们去求哪些数买不到?那这个值可能无穷大,我们无法对它进行判定,但是我们可以去寻找可以买到的值,那么怎么判定?

1.通过买不到的数的结论 互质的两数 a*b-a-b是最大的买不到的数,那么我们只需要去判断这存在着的所有数种,是否有两个数是互质数,如果有,那么,a*b-a-b之后的所有数都可以获得,而其他数我们再进行判断;

2.存在互质数的情况下,它可能不只是一组,比如  3  6 10 11;

3和10互质,3和11互质,10和11互质 ;那么我们取哪一个?我们取结果最小的一个,这样可以让后面的运算更少,所以选择3*10;

3.判断完了买不到的最大值后,我们就可以用完全背包的方式,把所有可以获得的值获得,方法类似于去年的砝码称重,每次选择一种包子,看放入它后能填满哪些位置;

假设 3   7;买不到的最大值为3*7-10=11;

放入3,可以填满3   6  9;放入7,填满 7  10;所以1-11可以填满的位置为3  6  7  9  10,剩下的位置则为买不到的值;

4.如果存在1,则说明所有数都可以获得,那么就输出0;

具体代码如下:

import java.io.*;
import java.util.Arrays;
public class 包子凑数 {
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st=new StreamTokenizer(br);
    public static void main(String[] args) throws Exception {
        int n = nextInt();
        int[] arr = new int[101];
        Arrays.fill(arr, 999);
        int t, s = 0;//s用来求取有多少种不同的蒸笼
        for (int i = 0; i < n; i++) {
            t = nextInt();
            if (arr[t] == 999) {
                arr[t] = t;
                s++;
            }
        }
        Arrays.sort(arr);//排序
        if (arr[0]==1){//存在1的,说明所有数字都可以获得
            System.out.println(0);
            return;
        }
        int k = 10001;
        for (int i=0;i<s-1;i++){
            for (int j=1;j<s;j++){
                if(gcd(arr[i],arr[j])==1){
                    k=Math.min(k,arr[i]*arr[j]);
                }
                if (k==arr[i]*arr[j]||arr[i]*arr[j+1]>=k)
                    break;
            }
            if (arr[i]*arr[i+1]>=k){
                break;
            }
        }//找出乘积最小互质数相乘的结果
        int []sk=new int[101];
        for (int i=0;i<s;i++){
            for (int j=2;j<=arr[i];j++){
                if (arr[i]%j==0){
                    sk[j]++;
                }
            }
        }
        Arrays.sort(sk);
        if (k>10000&&sk[100]==n){
            System.out.println("INF");//不存在互质数,说明全是倍数关系,则有无限多个值无法获得
            return;
        }
        int []crr=new int[k+1];
        int []drr=new int[k+1];
        int m=0,co,ss;
        for (int i=0;i<s;i++){//每一次选择一种包子
            co=m;
            for (int y=0;y<co;y++){//已经拥有可以获得的包子种类
                for (int j=1;j<=(k-drr[y])/arr[i];j++){
                    ss=drr[y]+arr[i]*j;
                    if (crr[ss]==0){
                        crr[ss]=ss;
                        drr[m]=ss;
                        m++;
                    }
                }
            }
            for (int j=1;j<=k/arr[i];j++){
                if (arr[i]*j>k){
                    break;
                }
                if (crr[arr[i]*j]==0){//说明该值没有出现过
                    drr[m]=arr[i]*j;
                    crr[arr[i]*j]=arr[i]*j;//该值已经出现
                    m++;
                }
            }
        }
        System.out.println(k-m);
    }
    static  int nextInt() throws Exception{
        st.nextToken();
        return (int)st.nval;
    }
    public static int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
}

三、求值

 

解析:

这题的话,直接暴力破解就好,值不大!!!

代码:

public class 求值 {
    public static void main(String[] args) {
        int count=0;
        for (int i=1;;i++){
            for (int j=1;j<=i;j++){
                if(i%j==0){
                    count++;
                }
                if(count==100){
                    System.out.println(i);
                    return;
                }
            }
            count=0;
        }
    }
}

四、青蛙跳杯子

昨天dfs,今天bfs,小怂不会,正在强行理解!!!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值