2013蓝桥杯C组决赛java

 

 

标题:好好学习


    汤姆跟爷爷来中国旅游。一天,他帮助中国的小朋友贴标语。他负责贴的标语是分别写在四块红纸上的四个大字:“好、好、学、习”。但是汤姆不认识汉字,他就想胡乱地贴成一行。

    请你替小汤姆算一下,他这样乱贴,恰好贴对的概率是多少?

    答案是一个分数,请表示为两个整数比值的形式。例如:1/3 或 2/15 等。
如果能够约分,请输出约分后的结果。


    注意:不要书写多余的空格。




    请严格按照格式,通过浏览器提交答案。

 

 

 

    注意:只提交这个比值,不要写其它附加内容,比如:说明性的文字。

 

import java.util.HashSet;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		
	//4的全排列 4*3*2*1 = 24
	//24排列 中有必定有两次  好好学习
	//答案呢 1/12
	}
}

 

 

标题:埃及分数


    古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。


    这里,a 和 b 必须是不同的两个整数,分子必须为 1


    比如,2/15 一共有 4 种不同的分解法(姑且称为埃及分解法):


1/8 + 1/120
1/9 + 1/45
1/10 + 1/30
1/12 + 1/20




    那么, 2/45 一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)? 请直接提交该整数(千万不要提交详细的分解式!)。


    请严格按照要求,通过浏览器提交答案。

 

 

 

    注意:只提交分解的种类数,不要写其它附加内容,比如:说明性的文字

 

思路:

找规律。。。不存在的。我不会

import java.util.HashSet;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		
		int count = 0;
		for(int i=2;i<9990;i++){
			for(int j=i+1;j<9990;j++){
				//分子
				int a1 = i+j;
				//分母
				int a2 = i*j;
				//最大公分数
				int fen = ojl(a1,a2);
				a1 = a1/fen;
				a2 = a2/fen;
				if(a1==2&&a2==45){
//				System.out.println(i+" "+j);
					count++;
				}
			}
		}
		System.out.println(count);
	
	}	
	
	//欧几里得
	static int ojl(int a,int b){
		if(b==0)return a;
		return ojl(b,a%b);
	}
	
}

 

 

标题:金蝉素数

 


    考古发现某古墓石碑上刻着一个数字:13597,后研究发现:


    这是一个素数!
    
    并且,去掉首尾数字仍是素数!


    并且,最中间的数字也是素数!


    这样特征的数字还有哪些呢?通过以下程序的帮助可以轻松解决。请仔细阅读代码,并填写划线部分缺失的代码。


public class A
{
static boolean isPrime(int n)
{
if(n<=1) return false;
for(int i=2; i*i<=n; i++){
if(n%i==0) return false;
}
return true;
}

static void f(int[] x, int k)
{
if(_____________________________){  // 填空位置
if(isPrime(x[0]*10000 + x[1]*1000 + x[2]*100 + x[3]*10 + x[4]) &&
isPrime(x[1]*100 + x[2]*10 + x[3]) &&
isPrime(x[2]))
System.out.println(""+x[0]+x[1]+x[2]+x[3]+x[4]);
return;
}

for(int i=k; i<x.length; i++){
{int tmp=x[k]; x[k]=x[i]; x[i]=tmp; }
f(x,k+1);
{int tmp=x[k]; x[k]=x[i]; x[i]=tmp; }
}
}

static void test()
{
int[] x = {1,3,5,7,9};
f(x,0);
}

public static void main(String[] args)
{
test();
}
}




    请分析代码逻辑,并推测划线处的代码,通过网页提交。
    注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!

 

 

 

k==x.length-1

...这个题有问题吧,9是素数??


 

标题:危险系数

 


    抗日战争时期,冀中平原的地道战曾发挥重要作用。


    地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
  
    我们来定义一个危险系数DF(x,y):
    对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。


    本题的任务是:已知网络结构,求两站点之间的危险系数。




    输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数 ;
    接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;
    最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。


    输出:一个整数,如果询问的两点不连通则输出-1.


例如:
用户输入:
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
则程序应该输出:
2


资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗  < 2000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。

 

 

注意:主类的名字必须是:Main,否则按无效代码处理。

 

点击链接查看详解

 

 


 

 

 

标题:公式求值

 


    输入n, m, k,输出图1所示的公式的值。其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数。组合数的计算公式如图2所示。


    输入的第一行包含一个整数n;第二行包含一个整数m,第三行包含一个整数k。


    计算图1所示的公式的值,由于答案非常大,请输出这个值除以999101的余数。


【样例输入1】
3
1
3
【样例输出1】
162


【样例输入2】
20
10
10
【样例输出2】
359316


【数据规模与约定】
对于10%的数据,n≤10,k≤3;
对于20%的数据,n≤20,k≤3;
对于30%的数据,n≤1000,k≤5;
对于40%的数据,n≤10^7,k≤10;
对于60%的数据,n≤10^15,k ≤100;
对于70%的数据,n≤10^100,k≤200;
对于80%的数据,n≤10^500,k ≤500;
对于100%的数据,n在十进制下不超过1000位,即1≤n<10^1000,1≤k≤1000,同时0≤m≤n,k≤n。


【提示】
999101是一个质数;
当n位数比较多时,绝大多数情况下答案都是0,但评测的时候会选取一些答案不是0的数据;


资源约定:
峰值内存消耗(含虚拟机) < 128M
CPU消耗  < 2000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

 

 

 

数学不会

 

 

 


 

标题:横向打印二叉树

 


    二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。


    当遇到空子树时,则把该节点放入那个位置。 


    比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如图1所示。 


    本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。 


    输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。
    输入数据中没有重复的数字。 


    输出该排序二叉树的横向表示。 对应上例中的数据,应输出:


   |-12
10-|
   |-8-|
       |   |-7
       |-5-|
           |-4




    为了便于评卷程序比对空格的数目,请把空格用句点代替:
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4


例如:
用户输入:
10 5 20
则程序输出:
...|-20
10-|
...|-5


再例如:
用户输入:
5 10 20 8 4 7
则程序输出:
.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4




高度问题,任何一个节点的y高度是相对于自己父节点的高度,+上所有的右节点
父节点的右子树高度是相对于自己父节点 ,-自己左节点数量
父节点的右字数高度是相对于自己的父节点,+自己右子树数量






资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。

 

 

注意:主类的名字必须是:Main,否则按无效代码处理。

 

 

//写了一个下午的程序,,不停整理思路。。。比赛遇见这种题我建议,直接跳过

我的思路是,先构建好二叉排序树

递归遍历 右 、根、左 节点  在 回归的过程中 不断 调试,添加 . 和  |

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

public class A {
	//节点类
	static class Node{
		Node parent;
		Node left = null;
		Node right = null;
		int value;
		int depth;//深度..没有用上
		public Node() {
			super();
		}
		public Node(int value){
			super();
			this.value = value;
		}
	}
	static Node addNode(Node root,int num,int index){
		if(root==null){
			Node node = new Node(num);
			node.parent=root;
			node.depth=index;
			return new Node(num);
		}
		if(num<root.value){
			Node node = addNode(root.left,num, index+1);
			node.parent=root;
			node.depth=index+1;
			root.left = node;
			
		}else{
			Node node = addNode(root.right,num, index+1);
			node.parent=root;
			node.depth=index+1;
			root.right = node;
		}
		return root;
	}
	
	//逆中序遍历
	static List<String> infix(Node root){
		if(root==null)return null;
		List<String> list =  new ArrayList<String>();
		//先去形成右子树list
		List<String> lst = infix(root.right);
		
		//根节点只有自己根:
		String pre ;
		List<String> zst = new ArrayList<String>();
		//根据节点关键信息生成节点样式
		if(root.left==null&&root.right==null){
			pre = "-"+root.value;
		}else if(root.parent==null){
			pre = root.value+"-|";
		}else{
			pre = "-"+root.value+"-|";
		}
		zst.add(pre);
		
		//去生成左边节点list
		List<String> rst = infix(root.left);
		
		int dlen = 0;
		//点的个数,是根据根节点的长度决定
		dlen = zst.get(0).length()-1;
		
		
		if(lst!=null){
			//控制有些时候不是插入"|"  可以默认插入 | 进行试验
			String chidStr = ".";
			for(int i=0;i<lst.size();i++){
				String str = lst.get(i);
				//当右边没有. 的时候 就是 出现左节点。  就不需药输出多余的|啦
				if(!str.contains("."))chidStr = "|";
				lst.set(i,getSpn(dlen)+chidStr+str);
				
			}
			list.addAll(lst);
		}
		
		//zst肯定只有一个list ,直接插入 list
		list.add(zst.get(0));
		
		if(rst!=null){
			//控制有些时候不是插入"|"  可以默认插入 | 进行试验
			String chidStr = "|";
			for(int i=0;i<rst.size();i++){
				String str = rst.get(i);
				rst.set(i,getSpn(dlen)+chidStr+str);
				//当右边没有. 的时候 就是 出现左节点。  就不需药输出多余的|啦
				if(!str.contains("."))chidStr = ".";
			}
			list.addAll(rst);
		}
		return list;
	}
	
	//生成多少点
	static String getSpn(int n){
		StringBuilder kong = new StringBuilder(".");
		StringBuilder res = new StringBuilder();
		for(int i=0;i<n;i++){
			res.append(kong);
		}
		return res.toString();
	}
	
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] inLen = input.nextLine().trim().split(" ");
		Node root = null;
		//生成排序树
		for(int i=0;i<inLen.length;i++){
			root = addNode(root,Integer.parseInt(inLen[i]),0);
		}
		List<String> list = infix(root);
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值