当前位置: 代码迷 >> 综合 >> 2018年 第9届 蓝桥杯 Java B组 省赛
  详细解决方案

2018年 第9届 蓝桥杯 Java B组 省赛

热度:35   发布时间:2024-02-26 09:16:38.0

二、方格计数
题目:
在这里插入图片描述
代码:

package 蓝桥真题;
/*
* 一共四个象限,计算出一个之后乘以4就行
* 以左下角的坐标代表他们,只要两点间距离小于半径就行*/
public class 九届02 {
    public static void main(String[] args) {
    int count=0;for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
    int a=i+1;int b=j+1;if(a*a+b*b<=1000*1000){
    //两点之间距离小于半径就可count++;}}}System.out.println(count*4);}
}

三、复数幂
题目:
在这里插入图片描述
代码:

package 蓝桥真题;import java.math.BigInteger;/*
* 复数的运算
* (x+y*i)*(a+b*y)
* =ax+bxi+ayi+byi^2(i^2=-1)
* =(ax-by)+(xb+ya)i
* 令x=ax-by
* 令y=xb+ya
*2次幂:循环一次    123456次幂:123455
*
*BigInteger不是基本数据类型之一,它更像String,
* 是Java中的一个类所以加减乘除也不能用+,-,*,/
* 而是用add()、subtract()、mutiply()、divide()这四种方法
* */
public class 九届03 {
    public static void main(String[] args) {
    BigInteger a=new BigInteger("2");BigInteger b=new BigInteger("3");BigInteger x=new BigInteger("2");BigInteger y=new BigInteger("3");for (int i = 0; i < 123455; i++) {
    BigInteger t=x;x=x.multiply(a).subtract(y.multiply(b));y=t.multiply(b).add(y.multiply(a));}System.out.println(x+""+((y.compareTo(BigInteger.ZERO)>0)?"+":"")+y+"i");}
}

输出到文件:

package provincialGames_09_2018;//import java.io.*;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;public class A03_复数幂2 {
    public static void main(String[] args) {
    try {
    //改变输出流,输出到work.txt文件PrintStream ps = new PrintStream(new FileOutputStream("G:\\work.txt"));System.setOut(ps);  //文件输出  用System.out.println()即可将内容输出到文件中BigInteger a = new BigInteger("2");BigInteger b = new BigInteger("3");BigInteger x = new BigInteger("2");BigInteger y = new BigInteger("3");for(int i = 0; i < 123455; i++) {
    BigInteger t = x;x = x.multiply(a).subtract(y.multiply(b));y = t.multiply(b).add(y.multiply(a));}System.out.println(x + "" + ((y.compareTo(BigInteger.ZERO) > 0)? "+" : "") + y + "i");} catch (Exception e) {
      //抛出异常e.printStackTrace();}}}

四、测试次数
题目:
在这里插入图片描述
思路:动态规划
题目理解:
在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
1,测试多少次:需要摔多少次手机
2,增加手机数是为了尽量少摔手机
例如:
1,只有1部手机时,我们只能一层一层的摔,1000层的话,就摔1000次。
2,当我们把一部手机从2层楼上摔下是,有两种情况:碎了,没碎
此时只需要摔一次就可以得到耐摔指数了(在2层楼碎了的情况下往1层楼摔
一次, 碎了则代表指数是0,没坏就是1。在2层楼摔下去没碎的情况同理)
此时我们考虑只有一个手机三层楼的情况,我们此时并不能直接在二层楼上摔,
因为摔坏了,我们无法得知耐摔指数了,因此只能乖乖的从1层往下试。
规律总结:
dp[i][j]:表示j部手机从i层楼摔下去的测试
此时由于我们可以确定每个空的最大值为其前一楼层数+1(求2个手机,3楼的次数时,
在求2楼的条件下在3楼再摔一次一定可以得到3楼的次数),即dp[i-1][j]+1
最小值有两种情况:
损坏:继续尝试第k-1层,手机数-1:dp[k-1][j-1]
未损坏:继续尝试共n-k层,手机数不变:dp[n-k][j]
由于要求运气最差即:max(损坏情况次数,未损坏情况次数)
因为二者都在第k次尝试过一次,即max(损坏情况次数+1,未损坏情况次数+1)
在这里插入图片描述
代码:

package 蓝桥真题;import javafx.scene.transform.Scale;
import org.omg.CORBA.MARSHAL;import java.util.Scanner;public class 九届04 {
    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);int n=sc.nextInt();//楼的层数int m=sc.nextInt();//手机数//dp[i][j]表示i层楼时使用j部手机需要摔的最大次数int dp[][]=new int[n+1][m+1];//只有一部手机时,几层楼就要摔几次for (int i = 1; i <=n; i++) {
    dp[i][1]=i;}//两个及以上的手机时(j代表剩余的手机数,i代表剩余的楼层数)for (int j = 2; j <=m ; j++) {
    for (int i = 1; i <= n ; i++) {
    //赋最大初值(楼层每增高一层,其需要摔的次数一定会小于等于其楼层数加一的次数)dp[i][j]=dp[i-1][j]+1;for (int k = 2; k <i ; k++) {
    //dp[k-1][j-1]表示在第k层摔坏了//dp[i-k][j]表示在第k层没摔坏dp[i][j]=Math.min(dp[i][j],Math.max(dp[k-1][j-1]+1,dp[i-k][j]+1));}}}System.out.println(dp[n][m]);}
}

六,递增三元组
在这里插入图片描述
在这里插入图片描述
代码:

package 蓝桥真题;import javafx.scene.transform.Scale;import java.util.Scanner;public class 九届06 {
    public static void main(String[] args) {
    int count=0;Scanner sc=new Scanner(System.in);int n=sc.nextInt();int a[]=new int[n+1];int b[]=new int[n+1];int c[]=new int[n+1];for (int i = 1; i <= n ; i++) {
    a[i]=sc.nextInt();}for (int i = 1; i <= n; i++) {
    b[i]=sc.nextInt();}for (int i = 1; i <= n; i++) {
    c[i]=sc.nextInt();}for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
    for (int k = 1; k <= n; k++) {
    if(a[i]<b[j]&&b[j]<c[k]){
    //注意不能a[i]<b[i]<c[i]直接这样写count++;}}}}System.out.println(count);}
}

七,螺旋折线
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

package 蓝桥真题;/*
* 思路:分类讨论+找规律
* 思路:分类讨论+找规律。
* 我是先找四个象限的角点的规律,可以看到第一二四象限的角点各自与x
* 轴y轴都形成了一个小正方形,设这个小边长为t。
* 第一象限的角点规律是4t^2,那么在这个范围内的点就是4t^2+(x-y);
* 第二象限的角点规律是2t(2t-1),当abs(x)>y时,t就是-x,
* 那么在这个范围内的点就是2t(2t-1)-(-x-y);当abs(x)<y时,t就是y,
* 那么在这个范围内的点就是2t(2t-1)+(y-(-x))。
* 第四象限的角点规律是2t(2t+1),当x>abs(y)时,t就是x,
* 那么在这个范围内的点就是2t(2t+1)-(x-(-y));当x<abs(y)时,t就是-y,
* 那么在这个范围内的点就是2t(2t+1)+(-y-x)。
* 第三象限就有点复杂了,它的角点规律是(-x-y)^2,
* 由于在第三象限形成的是个小矩形,所以我们并不好找矩形,
* 但是至少可以看出这个角点上x和y的差值为1,这里不用t表示边长,
* 这里用t表示角点的(-x-y)是多少,当abs(x)>abs(y)时,t=-x-x-1,
* 那么这个范围内的点就是t^2+(-x-1-(-y)),否则,t=-y-y+1,
* 范围内的点就是t^2-(-y+1-(-x))。
* */
import java.util.Scanner;public class 九届07 {
    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);long x=sc.nextInt();long y=sc.nextInt();long t;long ans;if (x>=0&&y>=0) {
    //第一象限t=Math.max(x,y);ans=4*t*t+x-y;}else if (x<0&&y>0) {
    //第二象限t = Math.max(Math.abs(x), y);ans = 2 * t * (2 * t - 1) + Math.abs(y) - Math.abs(x);}else if (x>0&&y<0){
    //第四象限t=Math.max(Math.abs(x),Math.abs(y));ans=2*t*(2*t+1)+Math.abs(y)-Math.abs(x);}else{
    x=Math.abs(x);y=Math.abs(y)+1;t=Math.max(Math.abs(x),y);ans=(t+t-1)*(t+t-1)+x-y;}System.out.println(ans);}
}
  相关解决方案