第十四届蓝桥杯java真题

第十四届 蓝桥杯java组备赛考纲解读 技巧 查找 深搜宽搜 DFS 动态规划 数论 暴力枚举

官网还没出题目,最新做题网址:

2023年第十四届蓝桥杯大赛软件类省赛Java大学B组真题

数组分割

当时看错了 以为有奇数就不行,原来是和为奇数不行 沃日!就这道题最简单还没看错了

这种错题解法10%;哭了!!!

import java.util.Scanner;
import java.lang.Math;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int res[]=new int[n+1];
        for(int i=1;i<=n;i++){
            int m=sc.nextInt(); 
            res[i]=(int)Math.pow(2,m);
            for(int j=0;j<m;j++){
                int s=sc.nextInt();
                //System.out.println(s);
                if(s%2!=0){
                    res[i]=0;
                    break;
                }
            }   
        } 
         for(int i=1;i<=n;i++){
            System.out.println(res[i]);
            
        }
    }
}

大佬正解:

很明显实际上就是组合计数,把所有数分成偶数集合和奇数集合

L:表示奇数个数

R:表示偶数个数

奇数的 个数 为奇数时无解直接输出0即可

只需要枚举s1这个集合的选择,剩下的没有选择的就是s2的元素

偶数集:可以在这个集合里面选择0-R个元素,所有选择方案 sum=C(R,0)+C(R,1)+ C(R,2).....+C(R,R)。展开不难发现最终结果就是sum==2^R;

奇数集:只能在这个集合里面选偶数个数也就是0,2,4,6....L 这个也是展开找规律,展开观察可以发现C(L,0)+C(L,2)+C(L,4)....C(L,L)==2^(L-1)

奇数和偶数的所有选择方案就是 2^R * 2^(L-1)对1000000007取余即可,因为次方次数只有1000左右,无论是快速幂还是暴力均可

注意事项: 多展开,多画图,找到规律再做题,不要做一步看一步,这样大概率是做不出来题的。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int mod=1000000007;
LL qmi(LL a,LL p){
    if(p<0) return 1;
    LL res=1;
    while (p){
        if(p&1) res=res*a%mod;
        a=a*a%mod;
        p>>=1;
    }
    return res%mod;
}
int main(){
   int T;
   cin>>T;
    while (T--){
        LL n;
        cin>>n;
        LL l=0,r=0;//l表示奇数个数,r表示偶数个数
        int x;
        for(int i=1;i<=n;i++){
            cin>>x;
            if(x%2==0) r++;
            else l++;
        }
        if(l&1){
            cout<<0<<endl;
        }else{
            cout<<qmi(2,l-1)%mod*qmi(2,r)%mod<<endl;//也可以直接写成qmi(2,l-1+r)
        }
    }
}

我对照他的做的java改版,为啥不对捏

import java.util.Scanner;
import java.lang.Math;

public class Main {
    static int mod=1000000007;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();

        int res[]=new int[n+1];
        long l=0L,r=0L;//l表示奇数个数,r表示偶数个数
        for(int i=1;i<=n;i++){
            int m=sc.nextInt();

            for(int j=0;j<m;j++){
                int s=sc.nextInt();
                //System.out.println(s);
                if(s%2!=0)
                    l++;
                else
                    r++;
            }
            //判断奇数( (a&1)==1);判偶( (a&1) ==0)
            if((l&1)==1){
                res[i]=0;
            }else{
                res[i]= (int) (qmi(2L,l-1)%mod*qmi(2L,r)%mod);
                //也可以直接写成qmi(2,l-1+r)
            }
        }

        for(int i=1;i<=n;i++){
            System.out.println(res[i]);
        }
    }
    static Long qmi(long a,long p) {
        if(p<0) return 1L;
        long res=1L;
        while (p!=0){
            if((p&1)==1)
                res=res*a%mod;
            a=a*a%mod;
            p>>=1;
        }
        return res%mod;
    }
}

矩形总面积

考场上就是各种else if判重,具体咋做记不住了

下面这种拿了30%;

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr=new int[9];
        for(int i=1;i<=8;i++){//x1,y1,x2,y2,  x3,y3,x4,y4
            arr[i]=sc.nextInt();
        }
        //(x1, y1) 和(x2, y2) 依次是 R1 的左下角和右上角
        int s1=(arr[3]-arr[1])*(arr[4]-arr[2]);
        int s2=(arr[7]-arr[5])*(arr[8]-arr[6]);
        int s3=0;
        //重叠:f1的右上角<f2右&&》f2左
        if(arr[4]<arr[8]&&arr[3]<arr[7]&&arr[4]>arr[6]&&arr[3]>arr[5])
            s3=(arr[4]-arr[6])*(arr[3]-arr[5]);
        //重叠:f2的右上角<f1右&&》f1左
        else if(arr[8]<arr[4]&&arr[7]<arr[3]&&arr[8]>arr[2]&&arr[7]>arr[1])
            s3=(arr[8]-arr[2])*(arr[7]-arr[1]);
        System.out.println(s1+s2-s3);
    }
}

蜗牛

感觉得加点条件判断,贪心

拿9分

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt();
        int[] nr=new int[n+1];//零点
        int[] ar=new int[n+1];//传送起点
        int[] br=new int[n+2];//传送终点
        for(int i=1;i<n+1;i++){
            nr[i]=scanner.nextInt();
        }
        for(int i=1;i<n;i++){
            ar[i]=scanner.nextInt();
            br[i+1]=scanner.nextInt();
        }
        
        double s=nr[1];//到第一根杆子的0点了
        /*
            奇数杆子  传送起点的距离和走到下一根0点的距离作比较 点
            for(int i=1;i<n+1;i++){
                if(nr[i+1]-nr[i]>ar[i])
                    s+=ar[i];
               else     s+=(nr[i+1]-nr[i]);
             */   
        
        if(n%2!=0){//奇数杆子 n1的0点 ↑ ↓ ↑ ↓ →
            for(int i=1;i<n+1;i++){
                if(i==n){
                    s+=nr[i]-nr[i-1];
                }else if(i!=n&&i%2!=0){//↑
                    s+=ar[i]/0.7;
                }else if(i!=n&&i%2==0){
                    s+=br[i]/1.3;
                }
                
            }
        }else{//偶数杆子 n1的0点 ↑ ↓ ↑ ↓
            for(int i=1;i<n+1;i++){
                if(i%2!=0){
                    s+=ar[i]/0.7;
                }else if(i%2==0){
                    s+=br[i]/1.3;
                }   
            }
        }
        System.out.printf("%.2f",s);
    }
}
posted @   软工菜鸡  阅读(50)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示