蓝桥冲刺31天,第22天java题解

目录

一、ASC

二、排列数

解析:

代码:

三、平面切分

解析:

代码:


一、ASC

这题很快乐!!!

System.out.println((int)'L');

二、排列数

这题写起来很快乐!!!

 

解析:

这题是手推dp的,先上两张手推图,比较dp都要搞一下,盲想想不出来

 

第一步:带入几组数据:

1    1

2    2

3    2    4

4    2    12     10

5    2    28     58     32

然后,你就去寻找每一个数的关系式,去一步一步推导公式

每一个值都是通过前面的数值得到,所以在推导的时候,选出部分数据可以推导一个通用公式;

具体推可以看看我的草稿纸好吧

代码:

import java.util.Scanner;
public class 排列数 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        long [][]arr=new long[n+1][n+1];
        //初始情况,1/2不存在出现转折点,但是存在0转折
        //1对应的  1
        //2对应的 12  21
        arr[1][1]=1;
        arr[2][1]=2;
        //判断n的情况
        if (n<=2){
            System.out.println(arr[n][1]);
            return;
        }
        for (int i=3;i<=n;i++){
            for (int j=1;j<=i;j++){
                if (j==1){
                    arr[i][j]=2;
                }else{
                    //转移方程
                    arr[i][j]=(arr[i-1][j]*j+arr[i-1][j-1]*2+arr[i-1][j-2]*(i-j))%123456;
                }
            }
        }
        System.out.print(arr[n][m]);
    }
}

三、平面切分

这题看着很快乐!!!

 

解析:

这题数据并不大,最多只有1000条直线,所以直接爆算其实也可以得到答案

(1+1000)*1000/2,也就那么几十万次运算,但是有写点需要注意:

1.是否出现重复的线段?

2.是否出现互相平行的线段?

然后我们其实可以找一下多线相交后会多出的空间数的规律

具体情况可以自己在纸上画一下,这里就不推了

每一条新线放入形成x个交点,则增加x+1个平面

比如三条线

第一条线放入分成两歌平面,第二条和第一条有交点则分为4个平面,平行则分成3个平面;

第三条如果和前两条交点各不相同,则有2个交点,新增3个平面,在同一个交点上则新增两个平面,三线平行则新增1个平面

代码:

import java.util.Scanner;
public class 平面切分 {

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int[] brr = new int[n];
        double[] crr = new double[n - 1];
        int count = 1;
        int flag,s;
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
            brr[i] = sc.nextInt();
            if (i == 0) {
                count++;
                continue;
            }
            flag = 0;//用于判断重复线段
            for (int j = 0; j < i; j++) {
                if (arr[j] == arr[i] && brr[j] == brr[i])//说明重复
                    flag = 1;
            }
            if (flag == 1) {//去除重复线段
                i--;
                n--;
                continue;
            }
            s = 0;
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {//和该点平行,代表交点不可能重复
                    s++;
                    continue;
                }
                //查找交点数
                crr[j - s] =(brr[i] - brr[j]) / (double) (arr[j] - arr[i]);
                flag = 0;
                for (int k = 0; k < j - s; k++) {//s是平行数
                    if (crr[k] == crr[j - s])
                        flag = 1;
                }
                if (flag == 0)
                    count++;
            }
            count++;
        }
        System.out.println(count);
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值