蓝桥杯模拟赛1(大学生组&青少年组)
A. 试题A:战疫情 5’
描述
【问题描述】
为抗击新型冠状病毒感染的肺炎疫情,爱心人士小李花费5000050000元人民币购买xx只口罩,yy套防护服。已知x+yx+y的和在区间[20000, 21000].[20000,21000].
请问有多少种购买方案,是刚好花费5000050000元人民币的!
已知口罩价格22元/只,防护服价格100100元/套。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int a,b;//口罩、防护服的数量
double x=50000,ax=2,bx=100;
int n=0;
for(a=20000;a<=21000;a++) {
for(b=100;b>=0;b--) {
int amount=2*a+b*100;
if(amount==50000)
n++;
}
}
System.out.println(n);
}
}
B. 试题B:行动 5’
描述
【问题描述】
小明站在坐标(0, 0)(0,0)处,面朝 xx轴正方向。第一轮,他向前走 11单位距离,然后右转;第二轮,他向前走 22单位距离,然后右转;第三轮,他向前走 33单位距离,然后右转……他一直这么走下去。请问第 20202020轮后,他的坐标是:(_________,_________)。
public class Main {
public static void main(String[]args) {
int x=2020/4;
int a=2*x;
System.out.print((-1)*a+" "+a);
}
}
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为两个个数字,依次为x\ yx y,在提交答案时依次填写这两个数字,用一个空格隔开,填写多余的内容将无法得分。
C. 试题C:莱布尼茨公式 10’
描述
【问题描述】
已知,莱布尼茨的公式为:
可以通过莱布尼茨公式来计算\piπ的结果,当计算的项数越多,\piπ 的精确度越高。请计算前20202020项的值,保留66位小数。即:
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个保留66位的小数,在提交答案时只填写这个小数,填写多余的内容将无法得分。
public class Main {
public static void main(String[]args) {
double p=0.0,q;
for(int i=1;i<=2020;i++) {
if(i%2==0) {
q=2*i-1;
p=p-1.0/q;
}
else if(i%2!=0) {
q=2*i-1;
p=p+1.0/q;
}
}
p*=4;
System.out.printf("%.6f",p);
}
}
D. 试题D:价值之和 10’
描述
【问题描述】
定义数字x的价值为其不同质因子的个数。
例如:数字20202020可以写成2020=225*1012020=2∗2∗5∗101,其价值为33.
JM boy请你帮忙计算整数11到20202020中,所有都不包含数字55的正整数的价值之和。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数(提示:答案最后一位数是奇数),在提交答案时只填写这个整数,填写多余的内容将无法得分。
public class Main {
public static void main(String[]args) {
int sum=0;
for(int i=1;i<=2020;i++) {
if(!func1(i)) {
sum+=func2(i);
}
}
System.out.println(sum);
}
//判断整数中是否包含5,包含返回true,不包含返回false
public static boolean func1(int n) {
int num=n;
while(num>0) {
if(num%10==5)
return true;
else
num/=10;
}
return false;
}
//计算不同的质因子的个数
public static int func2(int n) {
int sum=0;
for(int i=1;i<=n;i++) {
if(n%i==0 && isPrime(i)) {
sum++;
}
}
return sum;
}
private static boolean isPrime(int n) {
if(n<2)
return false;
else {
for(int i=2;i<n/2+1;i++) {
if(n%i==0)
return false;
}
return true;
}
}
}
E. 试题E:数方 15’
描述
【问题描述】
在右图AA到II的99个格子中填入1-91−9中的任意数字,不要求每一个数字都填入,也不要求每一个数字只能填一次。
但是,得满足以下条件:
1、 数字ABCABC构成的三位数ABCABC是一个立方数
2、 数字DEFDEF构成的三位数DEFDEF是一个质数
3、 数字GHIGHI构成的三位数GHIGHI是一个平方数
4、 数字ADGADG构成的三位数ADGADG是一个三角数
5、 数字BEHBEH构成的三位数BEHBEH是一个四次方数
6、 数字CFICFI构成的三位数CFICFI是一个回文数
提示:三角数即正整数前nn项和:1, 3, 6, 10, 15, 21, 28, ……1,3,6,10,15,21,28,……
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为九个数字,依次为A B C D E F G H I,在提交答案时依次填写这九个数字,相邻两个数字用一个空格隔开,填写多余的内容将无法得分。
public class Main{
//判断一个数是否为立方数
public static boolean lifangshu(int i){
boolean k=false;
for(int j=1;j<=Math.pow(i, 1/2.9);j++){
if(i==j*j*j){
return true;
}
}
return false;
}
//判断一个数是否为质数
public static boolean zhishu(int i){
for(int j=2;j<i/2;j++){
if(i%j==0){
return false;
}
}
return true;
}
//判断一个数是否为三角数
public static boolean sanjiaoshu(int i){
for(int j=14;j<45;j++){
if(i==j*(j+1)/2){
return true;
}
}
return false;
}
//判断一个数是否为平方数
public static boolean pingfangshu(int i) {
if(Math.round(Math.sqrt(i))==Math.sqrt(i))
return true;
else
return false;
}
//输出四次方数
public static boolean sicifang(int i)
{
boolean k=false;
for(int j=1;j<=Math.pow(i, 1/4.0);j++)
{
if(i==j*j*j*j)
{
k=true;
}
}
return k;
}
public static void main(String[] args) {
for(int A=1;A<=9;A++) {
for(int B=1;B<=9;B++) {
for(int C=1;C<=9;C++) {
if(!lifangshu(A*100+B*10+C)) continue;//ABC立方数
for(int D=1;D<=9;D++) {
for(int E=1;E<=9;E++) {
for(int F=1;F<=9;F++) {
if(!zhishu(D*100+E*10+F))continue;//DEF质数
for(int G=1;G<=9;G++) {
if(!sanjiaoshu(A*100+D*10+G)) continue;//ADG三角数
for(int H=1;H<=9;H++) {
if(!sicifang(B*100+E*10+H)) continue;//BEH四次方数
for(int I=1;I<=9;I++) {
if(C!=I) continue;//CEI回文数
if(pingfangshu(G*100+H*10+I)) {//GHI平方数
System.out.printf("%d %d %d %d %d %d %d %d %d", A,B,C,D,E,F,G,H,I);
}
}
}
}
}
}
}
}
}
}
}
}
F. 试题F:你好,2020 15’
描述
20202020年,这个年份很特别,20202020从中间分成两个整数,大小形状完全一样。
wlxsq对形如20202020的数字很感兴趣(不包括前导零),在11到12001200中这样的数字包括11、22、3311、22、33、44、55、66、77、88、99、1010、111144、55、66、77、88、99、1010、1111,共1111个,他们的和是26162616。
请问,在11到nn中,所有这样的数的和是多少?
输入
输入一行包含一个整数nn。
输出
输出一行,包含一个整数,表示满足条件的数的和。
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int sum=0;
for(int i=1;i<=1000;i++) {
if(i>=1 && i<=9) {
int x=i*11;
if(x<=n)
sum+=x;
else
break;
}
else if(i>=10 && i<=99) {
int x=i*101;
if(x<=n)
sum+=x;
else
break;
}
else if(i>=100 && i<=999) {
int x=i*1001;
if(x<=n)
sum+=x;
else
break;
}
}
System.out.println(sum);
}
}
G. 试题G:最优值 18’
描述
已知有NN个单词,其排列为PP,编号从11到NN。
每个单词都有一个价值ValueValue,该价值与单词的首字母chch、单词的长度LL,以及该单词在排列中的编号IDID有关。
Value = |ch| * L * ID;Value=∣ch∣∗L∗ID;
|ch|∣ch∣ 表示字母chch对应的数字 a -> 1, b -> 2, ……, z -> 26a−>1,b−>2,……,z−>26
现在,wlxsq想知道,该如何排列这NN个单词,使得其(NN个单词)总价值和最大。请输出最大价值之和。
输入
输入一行包含一个整数nn。
接下来NN行,每行包含一个单词AiAi。
输出
输出最大价值之和。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
long value[]=new long[n];
for(int i=0;i<n;i++) {
String str=scan.next();
value[i]=(str.charAt(0)-'a'+1)*str.length();
}
Arrays.sort(value);//从小到大排列
int sum=0;
for(int i=1;i<=n;i++) {
sum+=value[i-1]*i;
}
System.out.println(sum);
}
}
H. 试题H:计算器 22’
描述
我们知道,windows自带calc功能。
wlxsq决定制作一个Calc,该Calc具备求解一元一次方程的功能。
为了简化工作,拒绝花里胡哨。这个方程中,只有一个等号"=",零个或多个加号"+"、减号"-",一种小写字母表示未知数。当然,减号也可是负号。
方程中并没有括号,也没有除号,方程中的字母表示未知数。
输入
仅一行,表示一个合法的方程,包含“+”、“-”、“=”、数字及小写字母。
输出
仅一行,表示答案,形式为“未知元=答案”。对答案保留3位小数,保证答案的绝对值不超过10000。
I. 试题I:对称迷宫 25’
描述
用EXCEL求解迷宫真香~
wlxsq有一个N*NN∗N的网格迷宫,每一个网格都有一个字母编号。
他要从左上角(1,1)(1,1)出发,走到右下角(n,n)(n,n),由于wlxsq很懒,所以他每次只会往右或者往下走一格。
由于最后到终点的路径方案太多太多了,所以wlxsq想让你计算出所有不同的对称的路径个数。
例如:N = 3
对称路径6条:有ABABA(2条)、ABBBA(4条)
不同的对称路径有: 有ABABA、ABBBA
输入
第一行输入一个数NN,表示迷宫的大小。
接下来输入N*NN∗N的字母迷宫
输出
输出对称路径的数量
J. 试题J:因数个数 25’
描述
求所有 2到 n 的整数中,因数个数第k少的数因数个数是多少。
输入
第一行两个正整数 n,k,即题目描述中的 n,k。
输出
输出仅一行,即因数个数第 k少的数因数个数。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int k=scan.nextInt();
int num[]=new int[n-1];//记录对应数字的因数个数
for(int i=2,j=0;i<=n;i++,j++) {
int sum=0;
for(int m=1;m*m<=i;m++) {
if(i%m==0) {
if(i/m==m)//如果两因子相同,则只加1
sum++;
//System.out.println(1);
else// 如果两因子不相同,则加2
sum+=2;
}
}
num[j]=sum;
}
Arrays.sort(num);//排序
System.out.println(num[k-1]);//输出第k少的数的因数个数
}
}