蓝桥杯练习5

  1. 问题 1431: [蓝桥杯][2014年第五届真题]分糖果
    建一个数组存放糖果数,多一位保存第0位数值,每次判断是否相等,相等则跳出,不等则从左到右刷新,再判断奇偶,奇则再刷新并让计数器+1
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] R = new int[n + 1];
		for (int i = 0; i < n; i++) {
			R[i] = sc.nextInt();
		}
		System.out.println(result(R, n));
	}

	static int result(int[] R, int n) {
		int count = 0;
		while (true) {
			boolean isEqual = true;
			for (int i = 0; i < n; i++) {
				if (R[0] != R[i]) {
					isEqual = false;
				}
			}
			R[n] = R[0];
			for (int i = 0; i < n; i++) {
				R[i] = R[i] / 2 + R[i + 1] / 2;
			}

			for (int i = 0; i < n; i++) {
				if (R[i] % 2 != 0) {
					R[i] += 1;
					count++;
				}
			}
			if (isEqual)
				break;
		}
		return count;
	}
}

  1. 问题 1434: [蓝桥杯][历届试题]回文数字
    遍历10001~999999,将int转化为string判断是否回文,截取三位算数位和是否相等,如果都满足就输出并将判断器置真,如果最后判断器为假输出-1
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		boolean y = false;
		for (int i = 10001; i < 1000000; i++) {
			if (i < 100000) {
				String s = String.valueOf(i);
				boolean r1 = (s.charAt(0) == s.charAt(4) && s.charAt(1) == s.charAt(3));
				boolean r2 = (i / 10000 * 2 + i / 1000 % 10 * 2 + i / 100 % 10 == n);
				if (r1 && r2) {
					System.out.println(i);
					y = true;
				}
			}
			if (i > 100000) {
				String s = String.valueOf(i);
				boolean r1 = (s.charAt(0) == s.charAt(5) && s.charAt(1) == s.charAt(4) && s.charAt(2) == s.charAt(3));
				boolean r2 = (i / 100000 * 2 + i / 10000 % 10 * 2 + i / 1000 % 10 * 2 == n);
				if (r1 && r2) {
					System.out.println(i);
					y = true;
				}
			}
		}
		if (!y)
			System.out.println(-1);
	}

}

这种办法需要枚举很多数,进行优化,直接只求前三位,若数位和满足则拼接成回文数,这样只需要9* 10 * 10 *2次即可

package 蓝桥;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		boolean y = false;
		for (int i = 1; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				for (int k = 0; k < 10; k++) {
					if (i * 2 + j * 2 + k == n) {
						System.out.printf("%d%d%d%d%d\n", i, j, k, j, i);
						y = true;
					}
				}
			}
		}
		for (int i = 1; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				for (int k = 0; k < 10; k++) {
					if (i * 2 + j * 2 + k * 2 == n) {
						System.out.printf("%d%d%d%d%d%d\n", i, j, k, k, j, i);
						y = true;
					}
				}
			}
		}
		if (!y)
			System.out.println(-1);
	}

}

进一步优化,只求前两位,第三位用n-前两位的数位和,然后判断是否在1~9之间,要注意有6位数时第三四位和必为偶数,若缺少的数位和是奇数时无法满足。这时循环次数仅为
9* 10 *2次

package 蓝桥;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		boolean y = false;
		for (int i = 1; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				int k = n - j * 2 - i * 2;
				if (k >= 0 && k < 10) {
					System.out.printf("%d%d%d%d%d\n", i, j, k, j, i);
					y = true;
				}
			}
		}
		for (int i = 1; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				int k = (n - j * 2 - i * 2) / 2;
				if (k % 2 == 0 && k / 2 < 10 && k >= 0) {
					System.out.printf("%d%d%d%d%d%d\n", i, j, k/2, k/2, j, i);
					y = true;
				}
			}
		}

		if (!y)
			System.out.println(-1);
	}

}

差距还是挺明显的
在这里插入图片描述
在这里插入图片描述

  1. 问题 1443: [蓝桥杯][历届试题]数字游戏
    我第一时间想到的是用数组,0位置1,每一位的值都是前一位的值+本位下标%k,但是由于数据量巨大会溢出,错误86%。
    由题意,只需要知道栋栋每次报数即可,对中间的数不关心,探究规律,报t个数要过t-1轮,每轮报数间隔n-1个数,每个报数之间的差值是一个首项为1,公差为1的等差数列的每n位的和
    在这里插入图片描述
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int t = sc.nextInt();
		long sum=1,num=1,a=1;
		for(int i=0;i<t-1;i++){
			num=((a+a+n-1)*n/2+num)%k;	//下一次的报数
			sum+=num;
			a=a+n;		//求下一个差值的首项
		}
		System.out.println(sum);

	}
}


发布了41 篇原创文章 · 获赞 1 · 访问量 1468

猜你喜欢

转载自blog.csdn.net/qq_44467578/article/details/104054906