解题思路:

    一开始看题是个数学题,就想着找找规律 ,然后在纸上看了半天发现有点乱 不太好写就想着换一种思路 在看M<=10

这样的话全排列也是挺快的只要在全排列中找到适合的就count++便好

于是乎开始了全排列

在开始时候一元的就是1 二元的就是2全放在一个数组里面

注意事项:

注意的是判断条件,还有要学会全排列

参考代码:

public static void f5(int[] arr, int k) {            //全排列
		if(k == arr.length) {
			boolean boo = judge(arr);    //判断条件满足
			if(boo) {
				count++;        //count++
			}
		}
		for(int i = k; i < arr.length; i++) {
			swap(arr,i,k);
			f5(arr,k+1);
			swap(arr,i,k);
		}
	}
public static boolean judge(int[] arr) {            //判断条件
		// TODO Auto-generated method stub
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {    //遍历一次数组 如果是一元的就sum+1
			if(arr[i] == 1) {
				sum += 1;
			}
			if(arr[i] == 2) {                //如果是二元的就sum-1
				sum -= 1;
			}
			if(sum<0) {                    //若出现了负数说明这种情况不符合直接return
				return false;
			}
		}
		return true;
	}
	
public static void swap(int[] arr ,int i, int j) {
		int c = arr[i];
		arr[i] = arr[j];
		arr[j] = c;
	}
public static void main(String[] args) {

		 Scanner sc=new Scanner(System.in);
		 int M = sc.nextInt();
		 int N = sc.nextInt();
		 int K = sc.nextInt();
		 int[] arr = new int[M];
		 Arrays.fill(arr, 0,N,1);
		 Arrays.fill(arr, N,arr.length,2);
		 f5(arr,0);
		 System.out.println(count);
	}


                                                                    

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论