第十二届蓝桥杯模拟赛(第三期)

第十二届蓝桥杯模拟赛(第三期)

无脑暴力 有错误望指正

问题描述
  给定一个矩阵 M,由 n 行 m 列组成,第 i 行第 j 列值为 M[i][j]。
  定义矩阵 M 的重量为矩阵中所有元素的和,几位weight(M)
  请找到矩阵左上角的一个子矩阵S(矩阵的前 r 行中的前 c 列组成),使得这个子矩阵的重量的两倍最接近矩阵 M 重量。即 |2 weight(S)-weight(M)| 最小。
  如果有多个子矩阵满足条件,请找出面积 r * c 最小的一个。
  如果仍然有多个子矩阵满足条件,请找出其中 r 最小的一个。
输入格式
  输入第一行包含两个整数 n, m,表示矩阵的大小。
  接下来 n 行,每行 m 个整数,表示给定的矩阵M。
输出格式
  输出一行,包含两个整数 r, c,表示子矩阵为矩阵 M 的前 r 行中的前 c 列。
样例输入
3 4
3 0 1 1
1 0 1 1
1 1 -2 4
样例输出
2 3
数据规模和约定
  对于 30% 的评测用例,1 <= n, m <= 20, -10 <= M[i][j] <= 10。
  对于 50% 的评测用例,1 <= n, m <= 100, -100 <= M[i][j] <= 100。
  对于所有评测用例,1 <= n, m <= 1000, -1000 <= M[i][j] <= 1000。

package com.xu.LanqiaoMoni;

import java.util.Scanner;

public class Main9 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int hang=sc.nextInt();
        int lie=sc.nextInt();
        int arr[][]=new int [hang][lie];
        for (int i=0;i<hang;i++){
            for (int j=0;j<lie ;j++){
                arr[i][j]=sc.nextInt();
            }
        }

    abs(arr,hang,lie);

    }
    //求出矩阵之和
    public  static  int sum(int[][] arr,int hang,int lie){
        int sum=0;
        for (int i=0;i<hang;i++){
            for (int j=0;j<lie ;j++){
                sum+=arr[i][j];
            }
        }
        return sum;
    }
    //求出最小的重量差的 r c
    public static  void abs(int[][] arr,int hang,int lie){
        int temp,num=0;
        int a=0;
        int b=0;
        for (int r=0;r<hang;r++){
            for (int c=0;c<lie;c++){
                Math.abs(2*sum(arr,r,c)-sum(arr,hang,lie));
                if (num==0){
                    num= Math.abs(2*sum(arr,r,c)-sum(arr,hang,lie));
                    a=r;
                    b=c;
                }else {
                    temp= Math.abs(2*sum(arr,r,c)-sum(arr,hang,lie));
                    if (num>temp){
                        num=temp;
                        a=r;
                        b=c;
                    }
                }
            }
        }
        System.out.printf("%d %d",a,b);
    }

}

问题描述
  杂货铺老板一共有N件物品,每件物品具有ABC三种属性中的一种或多种。从杂货铺老板处购得一件物品需要支付相应的代价。
  现在你需要计算出如何购买物品,可以使得ABC三种属性中的每一种都在至少一件购买的物品中出现,并且支付的总代价最小。
输入格式
  输入第一行包含一个整数N。
  以下N行,每行包含一个整数C和一个只包含"ABC"的字符串,代表购得该物品的代价和其具有的属性。
输出格式
  输出一个整数,代表最小的代价。如果无论如何凑不齐ABC三种属性,输出-1。
样例输入
5
10 A
9 BC
11 CA
4 A
5 B
样例输出
13
数据规模和约定
  对于50%的评测用例,1 <= N <= 20
  对于所有评测用例,1 <= N <= 1000, 1 <= C <= 100000

package com.xu.LanqiaoMoni;

import java.util.Scanner;

public class Main10 {
   public static void main(String[] args) {
       Scanner sc=new Scanner(System.in);
       int length=sc.nextInt();
       int arr[]=new int[length];
       String string[]=new String[length];
       for (int i=0;i<length;i++){
           arr[i]=sc.nextInt();
           string[i]=sc.next();
       }
       System.out.println(check(string,arr));
   }
   public static int check(String[]strings,int[]arr){
      int temp=0;
      int num=0;
       for (int i=0;i<strings.length-1;i++){
           for (int j=i+1;j<strings.length;j++){
               if (judge(strings[i]+strings[j])){
                   if (num==0){
                       num=arr[i]+arr[j];
                   }else {
                       temp=arr[i]+arr[j];
                       if (temp<num){
                          num=temp;
                       }
                   }
               }
           }
       }
       return num;
   }
   public  static boolean judge(String str){
       if (str.contains("A")&&str.contains("B")&&str.contains("C")&&str.length()==3){
           return true;
       }else {
           return false;
       }
   }
}

问题描述
  斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。
  根据以上定义,我们容易计算出斐波那契数列的前几项依次是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ……
  现在请你计算斐波那契数列第N项是奇数还是偶数?
输入格式
  输入的包含一个整数N。
输出格式
  如果是奇数输出1,是偶数输出0。
样例输入
10
样例输出
1
提示
  找规律。
数据规模和约定
  对于所有评测用例,1 <= N <= 1000000000。

package com.xu.LanqiaoMoni;


import java.util.Scanner;

public class Main8 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
       int a= sc.nextInt();
       if (check(a)%2==0){
           System.out.println(0);
       }else {
           System.out.println(1);
       }
    }
    //先求出数列的第N位是什么

    public  static  int check(int a){
        int number=0;
        if (a==1||a==2){
            number=1;
        }else {
            number=check(a-1)+check(a-2);
        }
        return number;
    }
}

问题描述
  在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。
  例如,1234567 写成 1,234,567。
  例如,17179869184 写成 17,179,869,184。
  给定一个整数,请将这个整数增加分割符后输出。
输入格式
  输入一行包含一个整数 v。
输出格式
  输出增加分割符后的整数。
样例输入
1234567
样例输出
1,234,567
样例输入
17179869184
样例输出
17,179,869,184
数据规模和约定
  对于 50% 的评测用例,0 <= v < 10^9 (10的9次方)。
  对于所有评测用例,0 <= v < 10^18 (10的18次方)。

package com.xu.LanqiaoMoni;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main6 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        String str=sc.next();
        StringBuilder stringBuilder=new StringBuilder(str);
        System.out.println(stringBuilder);
        str=stringBuilder.reverse().toString();
        System.out.println(str);

        char[]chars=str.toCharArray();
        String[]strings=str.split("");
        List<String>test=new ArrayList<String>();
        for (int i=0;i<strings.length;i++){
            test.add(strings[i]);
          if (test.size()%3==0&&i+1<strings.length){
              strings[i+1]=","+strings[i+1];
          }
        }
        String ss="";
        for (String s:test) {
           ss+=s;
        }
        StringBuilder stringBuilder2=new StringBuilder(ss);
        System.out.println(stringBuilder2.reverse());

    }
}

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值