hiahia,去年在C++组两道填空题全错被暴虐,今年转战Java组,裸考的成绩确实有点出乎意料。。今天正好有时间po一下答案
试题 A: 报数游戏
枚举一下就能找到规律。答案是202420242024 / 2 * 24
试题 B: 类斐波那契循环数
import java.util.*;
public class Main {
static int END = 10000000;
public static void main(String[] args) {
int MaxNumber = 0;
for(int i = 1; i <= END; i ++) { // 由1开始
int Length = GetNumnberLength(i);
int Array[] = new int[Length];
NumbertoArray(Array, i);
int k = 0;
while(true) {
Array[k] = ListNumberSum(Array);
if(Array[k] == i || Array[k] > i) break; // 要么是类斐波那契循环数要么不是
k = (k + 1) % Length;
}
if(Array[k] == i) { // 更新MaxNumber
if(MaxNumber <= i) {
MaxNumber = i;
}
}
}
System.out.println(MaxNumber);
}
public static int GetNumnberLength(int number) {
int len = 0;
while(number > 0) {
len ++;
number = number / 10;
}
return len;
}
public static void NumbertoArray(int array[], int number) {
for(int i = array.length - 1; i >= 0; i --) {
array[i] = number % 10;
number = number / 10;
}
}
public static int ListNumberSum(int array[]) {
int sum = 0;
for(int i = 0; i < array.length; i ++) sum = sum + array[i];
return sum;
}
}
试题C:分布式队列
思想就是简化成了一维数组,每个数组下标对应相应结点,数组对应值为同步的数的数量,只需关注最小的那个结点即可
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int Number = sc.nextInt(); // 输入
String Temp = sc.nextLine(); // 吃空格
int Array[] = new int [Number];
while(sc.hasNext()){
String Command = sc.nextLine();
if(Command.charAt(0) == 'a') {
Array[0] ++; // add命令
}else if(Command.charAt(0) == 'q') {
System.out.println(GetArrayMinNumber(Array));
}else {
String Split[] = Command.split("\\s+");
int Index = Integer.parseInt(Split[1]);
if(Array[Index] < Array[0]) Array[Index] ++; // 主节点还有多的元素才能同步
}
}
}
public static int GetArrayMinNumber(int array[]) {
int MinOne = Integer.MAX_VALUE;
for(int i = 0; i < array.length; i ++) {
if(MinOne >= array[i]) MinOne = array[i];
}
return MinOne;
}
}
试题D:食堂
这道题写的太烂了就不po了
试题E:最优分组
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int Number = sc.nextInt();
double P = sc.nextDouble();
double MinHope = Number;
int Index = 1;
for(int k = 1; k <= Number; k ++) {
if(Number % k == 0) {
double GetHope = Number * (1 - Math.pow(1 - P, k)) + Number / k;
if(GetHope < MinHope) {
MinHope = GetHope;
Index = k;
}
}
}
System.out.println(Index);
}
}