- 问题 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;
}
}
- 问题 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);
}
}
差距还是挺明显的
- 问题 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);
}
}