0
点赞
收藏
分享

微信扫一扫

蓝桥杯 - 煤球数目/生日蜡烛/分小组/抽签 (java)

千妈小语 2022-03-15 阅读 84

目录

1.煤球数目

2.生日蜡烛

3. 分小组

4.抽签


1.煤球数目

代码:

	/**
	  * 煤球数目
	 * 规律:
	 * 1
	 * 1+2
	 * 1+2+3
	 * 1+2+3+4
	 * ...
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		int sum = 0;
		int total = 0;
		for(int i = 1; i <= 100; i++) {
			//统计每一层的数量
			sum += i;
			//统计总共 100 层的数量
			total += sum;
		}
		System.out.println(total);
	}

结果: 171700

2.生日蜡烛

代码:

	/** 
          *  生日蜡烛
	 * @param args
	 */
	public static void main(String[] args) {
		// 从 0 岁开始尝试,假设最大是从 100岁开始吹蜡烛的
		for(int i = 0; i <= 100; i++) {
			int total = 0;   //统计总共吹的蜡烛
			//总数小于 236 时,继续往后 统计
			for(int j = i; total < 236; j++) {	
				total += j;
			}
			//判断 total 是不是刚刚好 是 236
			if(total == 236) {
				//答案就是它
				System.out.println("answer:::"+i);
				break;
			}
		}
	}

结果: 26

3. 分小组

代码:

	/**
	 * 这个方法 用来确定 第三组 的三个成员
	 * @param a
	 * @return
	 */
	public static String remain(int[] a)
	{
		String s = "";
		for(int i=0; i<a.length; i++){
			if(a[i] == 0) s += (char)(i+'A');
		}	
		return s;  //返回一个字符串
	}
	
	public static void f(String s, int[] a)
	{
		//第一个for 确定 第二组 第一个人
		for(int i=0; i<a.length; i++){
			if(a[i]==1) continue;   //检查是否重复
			a[i] = 1;
			//第二个for 确定 第二组 第二个人
			for(int j=i+1; j<a.length; j++){
				if(a[j]==1) continue;   //同上
				a[j]=1;
				//第三个for 确定 第二组 第三个人
				for(int k=j+1; k<a.length; k++){
					if(a[k]==1) continue;
					a[k]=1;
					//将各个成员打印出来
					System.out.println(s+" "+(char)('A'+i)+(char)('A'+j)+(char)('A'+k)+" "+remain(a));  //填空位置
					a[k]=0; //状态清零,好下一次又可以派他
				}
				a[j]=0;   //同上
			}
			a[i] = 0;   //同上
		}
	}
	
	public static void main(String[] args)
	{
		int[] a = new int[9];		
		a[0] = 1;    //确定的第一组的第一个成员
		
		for(int b=1; b<a.length; b++){
			a[b] = 1; //这层循环 确定了 第一组 的第二个成员
			for(int c=b+1; c<a.length; c++){
				a[c] = 1; //这层确定第一组第三个成员
				//将这三个成员处理成一个字符串
				String s = "A" + (char)(b+'A') + (char)(c+'A');
				f(s,a);    //递归找后面的成员
				a[c] = 0;  //这里进行回溯
			}
			a[b] = 0;
		}
	}

答案 : s+" "+(char)('A'+i)+(char)('A'+j)+(char)('A'+k)+" "+remain(a)

4.抽签

代码:

	/**
	 * dfs
	 * @param a 存放国家和每个国家派出最大人数的信息
	 * @param k 存放当前拜访到第几个国家了
	 * @param n 当前观察团还有几个人数空位
	 * @param s 存放每组观察团的人员
	 */
	public static void f(int[] a, int k, int n, String s)
	{
		//递归结束条件 : 每个国家都问过
		if(k==a.length){ 
			//考察团人数已满,打印这一组的人员
			if(n==0) System.out.println(s);
			return;
		}
		
		String s2 = s; //将当前已确定的人员存放到 s2 中
		for(int i=0; i<=a[k]; i++){
			f(a,k+1,n-i,s2);   //填空位置
			s2 += (char)(k+'A');
		}
	}
	
	public static void main(String[] args)
	{
		//有六个国家,对应数组的个数.
		//数组的内容对应每个国家所能 派出的最大人数
		int[] a = {4,2,2,1,1,3};
		
		//传5是因为 观察团 的组成人数 最多为 5 个
		f(a,0,5,"");
	}

答案 : f(a,k+1,n-i,s2)

举报

相关推荐

0 条评论