0
点赞
收藏
分享

微信扫一扫

蓝桥杯Java——算法训练

目录

1.印章

 2.拿金币

 3.数字游戏


1.印章

import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(new BufferedInputStream(System.in));
        //输入n和m
        int n = in.nextInt();
        int m = in.nextInt();
        //定义p代表每一次的概率
        double p = 1.0 / n;
        //定义dp数组 dp[m][n] 买m张凑齐n种
        double[][] dp = new double[m + 1][n + 1];
        //i代表买了i张 j代表凑齐j种
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                //因为i<j 不可能买了i张凑齐j种 所以dp=0;
                if (i < j) {
                    dp[i][j] = 0;
                } else if (j == 1) {
                    //如果j=1 买了i张凑齐j种 所以dp=p的i-1次方
                    dp[i][j] = Math.pow(p, i - 1);
                } else {
                    //其他情况 买了i张凑齐j种 第i张有两种情况 第一种和之前凑齐的一样 第二种和之前凑齐的不一样
                    dp[i][j] = dp[i - 1][j] * (j * p) + dp[i - 1][j - 1] * ((n - j + 1) * p);
                }
            }
        }
        System.out.printf("%.4f", dp[m][n]);
    }
}

 2.拿金币

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        s.nextLine(); //去除回车的影响
        int arr[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
            String str [] = s.nextLine().trim().split(" ");//把输入的字符串去掉首尾的空格后以" "为条件分割成一个String数组。
            for (int j = 0; j < n; j++) {
                arr[i][j]=Integer.parseInt(str[j]);//将字符数组中的元素变为数字
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int left = j-1 < 0 ? 0 : arr[i][j-1];//判断是否为最左面
                int up = i-1 < 0 ? 0 : arr[i-1][j];//判断是否为最上面
                arr[i][j] = Math.max(left,up) + arr[i][j];//取最左面和最上面其中金币数目最大的加上当前格子的初始金币数量
            }
        }
        System.out.println(arr[n-1][n-1]); //for循环从0开始,所以是n-1
    }
}

 3.数字游戏

import java.util.Scanner;
public class Main{
	static int n;		//题目的n
	static int sum;	//题目的sum
	static int b=0;	//用来判断是否找到符合题目的要求的答案,如果找到就不用运行了
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		 n=sc.nextInt();
		 sum=sc.nextInt();
		int[] arr=new int[n];			//定义数组来保存1-n的全排序
		int[] vis=new int[n+1];		//1-n的全排序求的过程用到
		dfs(0,arr,vis);					//递归寻找答案


	}

	private static void dfs(int step, int[] arr, int[] vis) {
		if(b==0){											//如果没有找到答案继续寻找
		if(step==n)
		{
			int[] arr1=new int[n];				//留着用来如果找到符合的序列,用于输出		
			for(int i=0;i<n;i++)
			{
				arr1[i]=arr[i];
			}
			for(int i=0;i<n-1;i++)				//按题目的要求计算这个1-n的排序是否符合题目的sum
			{
				for(int j=0;j<n-1;j++)
				{
					arr1[j]=arr1[j]+arr1[j+1];
				}
			}
			if(arr1[0]==sum)				//如果符合就结束了
			{
				for(int i=0;i<n;i++)
				{
					System.out.print(arr[i]+" ");
				} 
				b=1;
			}
				
			return;
			
		}	
		for(int i=1;i<=n;i++)			//这个循环就是用来找1-n的全排序,也可以自己写一个
		{
			if(vis[i]==0)
			{
				arr[step]=i;
				vis[i]=1;	//代表这个数列里面i值已经存在,不能再次出现,这是全排列和不能重复的全排列
				dfs(step+1, arr, vis);
				vis[i]=0;	//回溯,上面的i已经取了,因为循环原因,下一次vis是没有取的
			}
		}
		}
	}
}

 

举报

相关推荐

0 条评论