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
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;
// }
}