第九届蓝桥杯JavaA组(2018年)省赛真题解析
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九届蓝桥杯JavaA组(2018年)省赛真题解析相关的知识,希望对你有一定的参考价值。
第九届蓝桥杯JavaA组(2018年)省赛真题解析
1.分数
- 1/1+1/2+1/4+1/8+1/16+…
- 每项是前一项的一半,如果一共有20项,求这个和是多少
- 结果用分数表示,类似:
- 3/2,当然这这是加了前2项而已,分子分母要求互质,
- 提交的是已经约分过的分数。
思想:求出分子分母,同除最大公约数即可。
/**
* 1.分数
* 1/1+1/2+1/4+1/8+1/16+...
* 每项是前一项的一半,如果一共有20项,求这个和是多少
* 结果用分数表示,类似:
* 3/2,当然这这是加了前2项而已,分子分母要求互质,
* 提交的是已经约分过的分数。
*/
public class Main
static int n ;
public static void main(String[] args)
int index = 1, sum = 0 ;
for(int i=1; index<=20; i*= 2)
n = i ;
sum += i ;
index ++ ;
System.out.println(sum/gcd(sum,n) + "/" + n/gcd(sum,n));
private static int gcd(int sum, int n)
if(n==0)
return sum ;
return gcd(n, sum%n) ;
2.星期一
思想:做个平闰年判断,累积天数,然后除以7就是星期一的天数。
import static java.time.Year.isLeap;
public class Main1
public static void main(String[] args)
long days = 0 ;
for(int year=1901; year<=2000; year++)
if(isLeap(year))
days += 366 ;
else
days += 365 ;
System.out.println(days/7);
/**
private static boolean leap(int year)
if((year%4 == 0 && year%100!=0) || year%400==0)
return true ;
return false ;
*/
3.复数幂
思想:这个需要用到Java特有的BigInteger,然后迭代找出虚部和实部即可。
import java.math.BigInteger;
/**
* 3.复数幂
* 设i为虚数单位,对任意正整数n,(2+3i)^n的实部和虚部都是整数,
* 求(2+3i)^123456等于多少,这个数字很大,要求精确表示,
*/
public class Main
static BigInteger aa, bb ;
public static void main(String[] args)
BigInteger a = new BigInteger("2") ;
BigInteger b = new BigInteger("3") ;
aa = null;
bb = null ;
for(int i=1; i<=123455; i++)
aa = a.multiply(new BigInteger("2")).subtract(b.multiply(new BigInteger("3"))) ;
bb = b.multiply(new BigInteger("2")).add(a.multiply(new BigInteger("3"))) ;
a = aa ;
b = bb ;
System.out.println(a + "" + (b.compareTo(BigInteger.ONE)<=0 ? "" : "+") + b + "i");
4.方格计数
思想:求出一个象限满足限制条件的,乘以4即可。
public class Main
public static void main(String[] args)
long ans = 0 ;
long N = 50000;
long y = N ;
for(long x=1; x<=N; x++)
while(y>0 && x*x+y*y>N*N)
y -- ;
ans += y ;
System.out.println(4*ans);
5.代码填空:略
6.航班日期
思想:规律题,两次航行的时间差求和取平均就是航行时间。
/**
* 航班日期
3
17:48:19 21:57:24
11:05:18 15:14:23
17:21:07 00:31:46 (+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24
22:19:04 16:41:09 (+1)
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main1
static int T ;
static Scanner input = new Scanner(System.in) ;
public static void main(String[] args) throws ParseException
T = input.nextInt() ;
input.nextLine() ;
for(int i=0; i<T; i++)
long t1 = getTime() ;
long t2 = getTime() ;
long t = (t1+t2) / 2 ;
System.out.printf("%02d:%02d:%02d\\n",t/3600,t/60%60, t%60);
private static long getTime() throws ParseException
String time = input.nextLine() ;
String [] split = time.split(" ") ;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss") ;
Date t1 = simpleDateFormat.parse(split[0]) ;
Date t2 = simpleDateFormat.parse(split[1]) ;
int d = 0 ;
if(split.length==3)
d = Integer.parseInt(split[2].substring(2,3)) ;
return d*24*3600 + t2.getTime()/1000 - t1.getTime()/1000 ;
7.三体攻击
思想:这题比较,我用的是暴力法,可以通过部分测试用例,比较好的方法是二分加三维前缀和,但是赛场上还是用暴力迅速得分靠谱。
import java.util.Scanner;
/**
* 7.三体攻击
*
*/
public class Main
static int A,B,C,m ;
static int [][] attack ;
static int [][][] a ;
public static void main(String[] args)
Scanner input = new Scanner(System.in) ;
A = input.nextInt() ;
B = input.nextInt() ;
C = input.nextInt() ;
m = input.nextInt() ;
a = new int [A+1][B+1][C+1] ; //用来存储每个战舰的生命值
attack = new int [m][7] ;//记录每一轮攻击的7个数据
for(int i=1; i<=A; i++) //记录战舰的生命值
for(int j=1; j<=B; j++)
for(int k=1; k<=C; k++)
a[i][j][k] = input.nextInt();
for(int i=0; i<m; i++) //记录攻击信息
for(int j=0; j<7; j++)
attack[i][j] = input.nextInt() ;
for(int round=0; round<m; round++) //攻击轮数
for(int i=attack[round][0]; i<=attack[round][1]; i++)
for(int j=attack[round][2]; j<=attack[round][3]; j++)
for(int k=attack[round][4]; k<=attack[round][5]; k++)
if(a[i][j][k] > 0) //受到攻击生命值减少
a[i][j][k] -= attack[round][6] ;
else //生命值小于0,爆炸
System.out.println(round+1);
return ;
8.全球变暖
思想:搜索+标记
第一轮搜索算出有多少岛屿 ;
然后迭代遍历将不会被淹没的标记出来
第二轮搜出出不会被淹没的岛屿数量
两轮搜索的结果相减就是被淹没的岛屿数量
import java.util.Scanner;
/**
* 8.全球变暖
*/
/**
7
.......
.##....
.##....
....##.
..####.
...###.
.......
*/
public class Main
static char [][] a ;
static int N ;
static int cnt = 0, cnt1 ;
static int [] offsetX = -1,1,0,0 ;
static int [] offsetY = 0,0,-1,1 ;
public static void main(String[] args)
Scanner input = new Scanner(System.in) ;
N = input.nextInt() ;
a = new char [N][N] ;
String s = "" ;
int index = 0 ;
for(int i =0; i<N; i++)
s += input.next() ;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
a[i][j] += s.charAt(index++) ;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
if(a[i][j] == '#')
dfs1(a, i, j);
cnt ++ ;//计算岛屿数量
for(int i=1; i<N-1; i++) //还没被淹没的标记为#
for (int j = 1; j < N-1; j++)
if(a[i][j] == '1' && a[i-1][j] == '1' && a[i+1][j]=='1' && a[i][j-1]=='1' && a[i][j+1]=='1')
a[i][j] = '#' ;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
if(a[i][j] == '#')
dfs1(a, i, j);
cnt1 ++ ;//计算未被淹没的岛屿数量
System.out.println(cnt-cnt1); //被淹没的岛屿数量
private static void dfs1(char[][] a, int x, int y)
a[x][y] = '1' ;
for(int i=0; i<4; i++)
int nx = x + offsetX[i] ;
int ny = y + offsetY[i] ;
if(nx<0 || ny<0 || nx>N || ny>N)
continue;
if(a[nx][ny] == '#')
dfs1(a, nx, ny) ;
9.倍数问题
方法1:暴力枚举
三层循环,从大到小依次枚举,测试用例数据不是很大,可以通过大多数测试用例。
import java.util.Arrays;
import java.util.Scanner;
/**
* 9.倍数问题
*
*/
public class Main
static int n, K ;
static int [] a ;
static int sum ;
public static void main(String[] args)
Scanner input = new Scanner(System.in) ;
n = input.nextInt() ;
K = input.nextInt() ;
a = new int [n] ;
for(int i=0; i<n; i++)
a[i] = input.nextInt() ;
Arrays.sort(a) ;
以上是关于第九届蓝桥杯JavaA组(2018年)省赛真题解析的主要内容,如果未能解决你的问题,请参考以下文章