zoukankan      html  css  js  c++  java
  • 第九届蓝桥杯JavaC组决(国)赛真题

    1:年龄问题

    s夫人一向很神秘。这会儿有人问起她的年龄,她想了想说:
    “20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍”。

    你能算出s夫人现在的年龄吗?

    这道题就是暴力就可以了
    40

    2 : 海盗与金币

    12名海盗在一个小岛上发现了大量的金币,后统计一共有将近5万枚。
    登上小岛是在夜里,天气又不好。由于各种原因,有的海盗偷拿了很多,有的拿了很少。
    后来为了“均贫富”,头目提出一个很奇怪的方案:
    每名海盗都把自己拿到的金币放在桌上。然后开始一个游戏。
    金币最多的海盗要拿出自己的金币来补偿其他人。
    补偿的额度为正好使被补偿人的金币数目翻番(即变为原来的2倍)。
    游戏要一直进行下去,直到无法完成。
    (当金币数最多的不只一个人或最多金币的人持有金币数不够补偿他人的)

    游戏就这样紧张地进行了,一直进行了12轮,恰好每人都“放血”一次,
    更离奇的是,刚好在第12轮后,每个人的金币数居然都相等了!! 这难道是天意吗?

    请你计算,游戏开始前,所有海盗的初始金币数目,从小到大排列,中间有一个空格分开。

    答案形如:
    8 15 29 58 110 …
    当然,这个不是正确答案。

    public class haidaoyujinbi {
    	public static void main(String[] args) {
    
    		int[] b = new int[12];// 12名海盗
    
    		/**
    		 * 有将近5万枚硬币可知范围 因为在第12轮后 每个人的金币数都相等了 所以12个人总的金币数 应该是12的倍数
    		 */
    		for (int i = 12; i < 50000; i += 12) {
    			for (int j = 0; j < 12; j++) {// 12轮后的结果
    				b[j] = i / 12;
    			}
    			dfs(b, 11, i);// 最后一个是最大的
    		}
    
    	}
    
    	/**
    	 * b是这12个人手中的金币数 MaxIn是当前金币最多的那个人 sum为总的金币数
    	 */
    	public static void dfs(int[] b, int MaxIn, int sum) {
    		if (MaxIn < 0) {
    			for (int i = 11; i >= 0; i--) {
    				System.out.print(b[i] + " ");
    			}
    			// System.out.println("*"+sum);
    			return;
    		}
    		int count = 0;
    		for (int i = 0; i < 12; i++) {
    			if (i == MaxIn) {
    				continue;
    			} else {
    				if (b[i] % 2 != 0) {
    					return;
    				} else {
    					b[i] = b[i] / 2;
    					count += b[i];
    				}
    			}
    		}
    		b[MaxIn] = sum - count;
    		dfs(b, MaxIn - 1, sum);
    	}
    }
    
    
    //结果为    13 25 49 97 193 385 769 1537 3073 6145 12289 24577 
    

    (这道题可以以后没有了,蓝桥杯第十届已经是五道结果填空,五道编程大题了)
    3 全排列

    对于某个串,比如:“1234”,求它的所有全排列。
    并且要求这些全排列一定要按照字母的升序排列。
    对于“1234”,应该输出(一共4!=24行):
    1234
    1243
    1324
    1342
    1423
    1432
    2134
    2143
    2314
    2341
    2413
    2431
    3124
    3142
    3214
    3241
    3412
    3421
    4123
    4132
    4213
    4231
    4312
    4321

    下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。

    // 轮换前k个,再递归处理
    import java.util.*;
    public class A
    {
    	static void permu(char[] data, int cur){
    		if(cur==data.length-1){
    			System.out.println(new String(data));
    			return;
    		}
    
    		
    		for(int i=cur; i<data.length; i++){
    			char tmp = data[i]; 
    			for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
    			data[cur] = tmp;			
    
    			permu(data, cur+1);			
    
    			tmp = data[cur]; 
    			__________________________________________ ;//for(int j = cur; j < i; j++) data[j] = data[j + 1];     填空
    			data[i] = tmp;			
    		}
    	}
    	
    	static void permu(String x){
    		permu(x.toCharArray(),0);
    	}
    	
    	public static void main(String[] args){
    		permu("1234");
    	}
    }
    
    

    4 约瑟夫环

    n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
    (报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
    求最后剩下的人的编号。这就是著名的约瑟夫环问题。

    本题目就是已知 n,k 的情况下,求最后剩下的人的编号。

    题目的输入是一行,2个空格分开的整数n, k
    要求输出一个整数,表示最后剩下的人的编号。

    约定:0 < n,k < 1百万

    例如输入:
    10 3

    程序应该输出:
    4

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

    import java.util.Scanner;
     
    
    public class test1 {
     
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		int n = in.nextInt();
    		int k = in.nextInt();
    		System.out.println(cir(n,k));
    	}
    	
    	public static int cir(int n,int m){
    	    int p=0;
    	    for(int i=2;i<=n;i++){
    	        p=(p+m)%i;
    	    }
    	    return p+1;
    	}
    }
    
    

    其他的方法都会超时的,只能过部分样例
    这里应该使用约瑟夫环公式:详见下面链接,讲的很详细
    https://blog.csdn.net/weixin_42318538/article/details/89294690

    测试数据:
    100 3 91
    2000 196 1963
    10000 6847 4442
    520000 84795 7725
    820000 88795 458467
    820000 99999 188212
    721000 100001 142837
    951000 200001 102843
    999999 222222 177380

    5交换次数

    IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。
    招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:
    ABABTATT,这使得应聘者十分别扭。
    于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:
    BBAAATTT 这样的形状,当然,也可能是:
    AAABBTTT 等。

    现在,假设每次只能交换2个席位,并且知道现在的席位分布,
    你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。

    输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。
    输出是一个整数,表示至少交换次数。

    比如,输入:
    TABTABBTTTT

    程序应该输出:
    3

    再比如,输入:
    TTAAABB

    程序应该输出:
    0

    我们约定,输入字符串的长度n 不大于10万

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

    这道题小白表示不会

    6 自描述序列

    小明在研究一个序列,叫Golomb自描述序列,不妨将其记作{G(n)}。这个序列有2个很有趣的性质:

    1. 对于任意正整数n,n在整个序列中恰好出现G(n)次。
    2. 这个序列是不下降的。

    以下是{G(n)}的前几项:

    n 1 2 3 4 5 6 7 8 9 10 11 12 13
    G(n) 1 2 2 3 3 4 4 4 5 5 5 6 6

    给定一个整数n,你能帮小明算出G(n)的值吗?

    输入

    一个整数n。

    对于30%的数据,1 <= n <= 1000000
    对于70%的数据,1 <= n <= 1000000000
    对于100%的数据,1 <= n <= 2000000000000000

    输出

    一个整数G(n)

    【样例输入】
    13

    【样例输出】
    6

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

    这道题小白表示不会

    如果哪位大佬会的话能不能私信告诉我一下
    如果需要往届真题测试数据加我QQ:1439775520

  • 相关阅读:
    SVN服务器搭建(一)
    排序算法二:冒泡排序
    【LeetCode】136. Single Number
    【LeetCode】217. Contains Duplicate
    【LeetCode】189. Rotate Array
    【LeetCode】122. Best Time to Buy and Sell Stock II
    【LeetCode】26. Remove Duplicates from Sorted Array
    【LeetCode】20. Valid Parentheses
    【LeetCode】680. Valid Palindrome II
    【LeetCode】345. Reverse Vowels of a String
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079271.html
Copyright © 2011-2022 走看看