1 三角形
数字0到9可以组成很多个边长为4个数字的三角形,例如下图
0
3 1
6 5 2
9 8 7 4
仔细观察上面的三角形发现,上面的数比下面相邻的两个数都小,问这样的三角形有多少个?
请编程输出最终的结果。
预期输出:
768
思路
基本思路是将0-9进行全排列,然后将其转换为三角形进行判断
代码
public class Main{
static int[] f = new int[15];
static boolean[] book = new boolean[15];
static int[][] a = new int[6][6];
static int res;
public static void main(String[] args) {
dfs(1);
System.out.println(res);
}
//全排列函数(dfs式)
static void dfs(int step){
if(step > 10){
//每出现一个组合进行一次判断
check();
return;
}
for(int k = 0 ; k <= 9 ; k++){
if(!book[k]){
book[k] = true;
f[step] = k;
dfs(step+1);
book[k] = false;
}
}
}
//判断三角形是否符合条件的函数
static void check(){
int idx = 1;
//转换为三角形
for(int i = 1 ; i <= 4 ; i++)
for(int j = 1 ; j <= i ; j++)
a[i][j] =f[idx++];
//进行判断
for(int i = 1 ; i <= 3 ; i++){
for(int j = 1 ; j <= i ; j++){
if(a[i][j] > a[i+1][j] || a[i][j] > a[i+1][j+1]) return;
}
}
res++;
}
}
2 租自行车
春天到了,某公园租自行车的生意火爆,上午自行车就会全部租完,到了中午的时候,租车窗口排起了长龙,
假设还车的有r个人,租车的有b个人。现在的问题是,这些人有多少种排法,可以避免出现无车可租的情况。
输入格式
两个整数,表示r和b
输出格式
一个整数,表示队伍的排法的方案数。
样例输入1
2 3
样例输出1
0
样例输入2
3 2
样例输出2
5
数据规模和约定
r,b∈[0,16]
测试集:
测试集1 系统输入:16 16 预期输出:35357670 测试集2 系统输入:16 14 预期输出:25662825 测试集3 系统输入:15 16 预期输出:0
思路1
将还车的人设定为1,借车的人设定为-1,排成一个数组。如还车3人,借车2人,排成[1,1,1,-1,-1]。
然后进行全排列,找出所有组合。对每一种排列进行判断,从前往后依次相加,如果加到某一值时,和为负数,说明借车的人比还车的人多,就不符合条件。
如果借车的人数比还车的人多,则一定会有无车可借的情况,直接输出0。
该思路的问题是,数据规模是 1-16,也就是可能需要排列32位数,肯定是会TLE的。
代码1
import java.util.Scanner;
public class Main{
static int[] book = new int[2],ne = {
1,-1}