al笔试

8.3 号 第二题

给定一个字符串,字符串只包含abcdef 6个字母,求满足下列规则的最长子序列:
1.a必须在c,e前,c必须在e前;
2.b必须在d,f前, d必须在f前;
解法:
两个条件相互独立,可以首先把输入字符串拆分成两个只包含ace的字符串和bdf的字符串
然后求每个字符串的最长不下降子序列,和即为所求。
最长不下降子序列的求法应用二分优化,不会的可以看看leetcode最长上升子序列的解法
package test1;

import java.util.Scanner;

public class ali_8_24 {

    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        char[] arr=s.next().toCharArray();
        int len=arr.length;
        int l1=0;
        int l2=0;
        char[] c1=new char[len];
        char[] c2=new char[len];
        for(char c: arr) {
            if(c=='a'||c=='c'||c=='e')c1[l1++]=c;
            if(c=='b'||c=='d'||c=='f')c2[l2++]=c;
        }
        System.out.println(max(c1,l1)+max(c2,l2));
    }
    public static int max(char[] arr,int len) {
        int[] dp=new int[len];
        dp[0]=1;
        int maxlen=1;
        for(int i=1;i<len;i++) {
            int maxval=0;
            for(int j=0;j<i;j++) {
                if(arr[j]<=arr[i]) {
                     maxval=Math.max(maxval, dp[j]);
                }
            }
            dp[i]=maxval+1;
            maxlen=Math.max(maxlen, dp[i]);
        }
        return maxlen;
    }

}

7.29

给 n 个恐龙蛋及恐龙蛋的大小,按从大到小排列,第 i 个恐龙蛋每天增大 i,问最少几天会出现两个同样大小的恐龙蛋。

思路 :求相邻最小差值

package test1;

import java.util.Scanner;

public class dinosaur {

    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        String[] arr=s.nextLine().split(" ");
        int min=Integer.MAX_VALUE;
        for(int i=1;i<arr.length;i++) {
            min=Math.min(min,Integer.parseInt(arr[i-1])-Integer.parseInt(arr[i]));
        }
        System.out.println(min);
    }

}

7.31第一题

小强是一个农场主,农场里有n头牛,每头牛有着独一无二的体重,每一头牛的颜色可能跟是m种颜色其中的一种,小强带了一些牛(可能为0个)出来吃草。你需要回答出小强带出来的牛的组合一共有多少种可能?

注意:因为一头牛有自己的体重(没有两头牛体重相等),所以如果四头牛的体重分别是1,2,3,4,颜色分别是y1,y2,y3,y4和另一种方案:四头牛的体重分别是1,2,3,4颜色分别是y1,y3,y2,y4即使两个方案的颜色的种类对应的数量是相同的,但是因为颜色对应的体重不同,所以是两个不同的方案。
由于方案书可能很大,请对1e9+7取模。
输入描述:
两个整数n,m(1≤n,m≤10^9)
输入: 3,2

输出: 27
 
思路:0头牛--C(n,0)
1头牛--C(n,1)*m
2头牛--C(n,2)*m^2
...
n头牛--C(n,n)*m^n
加起来其实就是(m+1)^n
package test1;

import java.util.Scanner;

public class cow {

    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        int m=s.nextInt();
        int res=0;
        for(int i=1;i<=n;i++) {
            res+=((factorial(n,i,0)/factorial(i,i,0))*Math.pow(m,i));
        }
        System.out.println((res+1)% 1000000007);
    }
    public static int factorial(int n,int i,int count) {
        count++;
        if(count==i)return n;
        return n*factorial(n-1,i,count);
    }

    

//     public static void main(String[] args) {
//            Scanner in = new Scanner(System.in);
//            while (in.hasNextInt()) {
//                int n = in.nextInt();
//                int m = in.nextInt();
//                System.out.printf("%.0f\n", slice(m + 1, n));
//            }
//        }
//     
//        public static double slice(int m, int n) {
//            if (n == 1) {
//                return m;
//            }
//            double temp = slice(m, n / 2);
//            return ((n % 2 == 0 ? 1 : m) * temp * temp) % 1000000007;
//        }
    
}

 

posted @ 2020-08-04 11:46  我们村里的小花儿  阅读(183)  评论(0编辑  收藏  举报