第十一届校内模拟真题
15.125GB
【问题描述】
在计算机存储中,15.125GB是多少MB?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,
填写多余的内容将无法得分。
【答案】15488.0
【代码】
public static void main(String[] args) {
System.out.println(15.125*1024);
}
【输出】
15488
约数个数
【问题描述】
1200000有多少个约数(只计算正约数)。
【答案提交】
这是一道结果填空的题,
你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,
填写多余的内容将无法得分。
【答案】96
【分析】
什么使约数?
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
4的正约数有:1、2、4。
6的正约数有:1、2、3、6。
10的正约数有:1、2、5、10。
12的正约数有:1、2、3、4、6、12。
15的正约数有:1、3、5、15。
【代码】
public static void main(String[] args) {
System.out.println(fun(1200000));
}
// 返回约束的个数
public static int fun(int num) {
int count=0;
for(int i=1;i<=num;i++) {
if(num%i==0) {
count++;
}
}
return count;
}
【输出】
96
叶结点数
【问题描述】一棵包含有2019个结点的二叉树,
最多包含多少个叶结点?
【答案提交】这是一道结果填空的题,
你只需要算出结果后提交即可。本题的结果为一个整数,
在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】1010
【分析】
二叉树什么时候出现最多的叶结点的情况?
在完全二叉树的情况下可以得到最多的叶子节点。
叶子节点最多的个数与节点总数的奇偶有关,奇数个则有(n-1)/2+1个
偶数个则有n/2个。
【代码】
小编写的时候不知道这个公式,所以暴力破解
public static void main(String[] args) {
double sum = 0;
for(double i=0;i<2019;i++) {
if(sum>=2019) {
break;
}
sum = sum+ Math.pow(2,i);
System.out.println("该层有节点"+Math.pow(2,i)+"个---------------"+"树的层数"+(i+1)+"总计:"+sum);
}
System.out.println(1024-(2047-2019)/2);
}
【输出】
该层有节点1.0个---------------树的层数1.0总计:1.0
该层有节点2.0个---------------树的层数2.0总计:3.0
该层有节点4.0个---------------树的层数3.0总计:7.0
该层有节点8.0个---------------树的层数4.0总计:15.0
该层有节点16.0个---------------树的层数5.0总计:31.0
该层有节点32.0个---------------树的层数6.0总计:63.0
该层有节点64.0个---------------树的层数7.0总计:127.0
该层有节点128.0个---------------树的层数8.0总计:255.0
该层有节点256.0个---------------树的层数9.0总计:511.0
该层有节点512.0个---------------树的层数10.0总计:1023.0
该层有节点1024.0个---------------树的层数11.0总计:2047.0
1010
数字9
【问题描述】在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。
例如,1999这个数包含数字9,在计算只是算一个数。
【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】544
【分析】
将整型转为字符串型,利用String api的indexOf(),当一个数中没有出现字符9,返回-1
【代码】
public static void main(String[] args) {
int count = 0;
for(int i=1;i<=2019;i++) {
if(String.valueOf(i).indexOf('9')!=-1) {
count++;
}
}
System.out.println(count);
}
【输出】544
位数递增的数
【问题描述】一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】输入的第一行包含一个整数 n。
【输出格式】输出一行包含一个整数,表示答案。
【样例输入】30【样例输出】26
【评测用例规模与约定】对于 40% 的评测用例,1 >= n >= 1000。对于 80% 的评测用例,1 >= n >= 100000。对于所有评测用例,1 >= n >= 1000000。
【分析】首先想到的是指针指向整数的第一位,第一位与后一位进行比较。后来又想到可以用递归的方法,没想出来,于是借鉴了别人的代码
【代码】
非递归
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
System.out.println(fun(n));
}
public static int fun(int n) {
int count = 0;
boolean flag = true;
for(int i=1;i<=n;i++) {
flag = true;
String numString = String.valueOf(i);
for(int j=0;j<numString.length()-1;j++) {
if(!(numString.charAt(j)<=numString.charAt(j+1))) {
flag = false;
break;
}
}
if(flag) {
count++;
}
}
return count;
}
递归
public static int n=0;
public static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
sc.close();
fun(0,1);
System.out.println(count-1);
}
public static int fun(int num,int temp) {
// num 这个数,temp是位数
if(num>n) {
return 0;
}else {
count++;
}
for(int i=temp;i<10;i++) {
fun(num*10+i,i);
}
return count;
}
递增三元组
【问题描述】
在数列 a[1], a[2], ..., a[n] 中, 如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列, 请问数列中有多少个元素可能是递增三元组的中心。
【输入格式】
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
5
1 2 5 3 5
【样例输出】
2
【样例说明】
a[2] 和 a[4] 可能是三元组的中心。
【评测用例规模与约定】
对于 50% 的评测用例, 2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例, 2 <= n <= 1000,0 <= 数列中的数 <= 10000。
【代码】
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int a[] = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = scan.nextInt();
}
int num = fun(a);
System.out.println(num);
}
public static int fun(int a[]) {
int num = 0;
boolean flag = false;
for(int j = 1;j<a.length-1;j++) {
flag = false;
for(int i=0;i<j;i++) {
for(int k=j+1;k<a.length;k++) {
if(a[i]<a[j]&&a[j]<a[k]) {
num++;
flag = true;
break;
}
}
if(flag) {
break;
}
}
}
return num;
}
音节判断
【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.next();
if (fun(str)) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
public static boolean fun(String str) {
char chs[] = str.toCharArray();
String yuanyin = "aeiou";
int flag = 0;
for (int i = 0; i < chs.length; i++) {
if (flag % 2 == 0 && !yuanyin.contains(String.valueOf(chs[i]))) {
flag++;
} else if (flag % 2 != 0 && yuanyin.contains(String.valueOf(chs[i]))) {
flag++;
}
}
if (flag == 4) {
return true;
}
return false;
}
长草
【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g...
.....
..g..
.....
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。
public static int[][] bool;
public static int k = 0, n = 0, m = 0;
public static char block[][];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
bool = new int[n][m];
block = new char[n][m];
for (int i = 0; i < n; i++) {
char temp[] = scan.next().toCharArray();
for (int j = 0; j < m; j++) {
block[i][j] = temp[j];
}
}
k = scan.nextInt();
fun(block, k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(block[i][j]);
}
System.out.println();
}
}
public static void fun(char block[][], int k) {
while (k > 0) {
for (int i = 0; i < block.length; i++) {
for (int j = 0; j < block[i].length; j++) {
if (block[i][j] == 'g')
bool[i][j] = 1;
}
}
for (int i = 0; i < bool.length; i++) {
for (int j = 0; j < bool[i].length; j++) {
if (bool[i][j] == 1) {
if (i - 1 >= 0) {
block[i - 1][j] = 'g';
}
if (i + 1 < block.length) {
block[i + 1][j] = 'g';
}
if (j - 1 >= 0) {
block[i][j - 1] = 'g';
}
if (j + 1 < bool[i].length) {
block[i][j + 1] = 'g';
}
}
}
}
k--;
}
}
序列计数
【问题描述】
小明想知道,满足以下条件的正整数序列的数量:
- 第一项为 n;
- 第二项不超过 n;
- 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
【样例输入】
4
【样例输出】
7
【样例说明】
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
【评测用例规模与约定】
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。
public static int n=0,count=0;
public static int [] []map ;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n =sc.nextInt();
sc.close();
map = new int [n+1][n+1];
for (int i = 1; i <=n; i++) {
map[i][i]=1;
map[i][0]=1;
map[0][i]=1;
}
for (int i = 1; i <=n; i++) {
count+=f(n,i);
count%=10000;
// System.out.println(count);
}
System.out.println(count);
// System.out.println(f(4,2));
}
public static int f(int x,int y){
if(map[x][y]!=0){
return map[x][y];
}
for (int i = Math.abs(x-y)-1; i>=0; i--) {
map[x][y]+=f(y,i);
}
map[x][y]%=10000;
// map[y][x]=map[x][y];
// System.out.println();
return map[x][y];
}
晚会节目单
【问题描述】
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
【输入格式】
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
第二行包含 n 个整数,依次为每个节目的好看值。
【输出格式】
输出一行包含 m 个整数,为选出的节目的好看值。
【样例输入】
5 3
3 1 2 5 4
【样例输出】
3 5 4
【样例说明】
选择了第1, 4, 5个节目。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n <= 20;
对于 60% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] num = new int[n];
int[] order = new int[n];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
order[i] = num[i];
}
sc.close();
Arrays.sort(order);
ArrayList<String> list = new ArrayList<String>();
for (int i = n - m; i < n; i++) {
list.add(order[i]+"");
}
StringBuilder sb = new StringBuilder("");
for (int i : num) {
if (list.contains(i+"")) {
list.remove(i+"");
sb.append(i + " ");
}
}
System.out.println(sb);
}