蓝桥冲刺31天,第六天java打卡

目录

一.巧排扑克牌 精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课

二.质数拆分  精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课

三.日志统计  精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课

四.递增三元组   “蓝桥杯”练习系统

五.外卖店优先级  精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课


一.巧排扑克牌

先看题:

这题的话,可以手推,但是会累人,然后第一次的6张牌其实很明显在2/4/6/8/10/12的位置,所以手推也只需要判断剩余7张牌的位置

但是身为一个准备蓝桥杯的人,怎么能不写个代码出来呢?

每一次,都把最下面一张放到最上面,总共13张牌,那么每2次拿出1张,最多26次就可以拿完,

那么我们可以定一个数组,然后给1-13位分别赋值为1-13,然后最后输出每一次取出的牌的位置,再把对应位置对上,即可

代码如下:

public class 巧排扑克牌 {
    public static void main(String[] args) {
        int []arr=new int[100];
        for (int i=1;i<=13;i++){
            arr[i]=i;
        }
        int []brr=new int[13];
        int k=0,m=14;
        for (int i=1;k<13;i++){
            if(i%2==1){
               arr[m]=arr[i];
               m++;
            }else{
                brr[k]=arr[i];
                k++;
            }
        }
        String []s= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String []ss=new String[13];
        for (int i=0;i<13;i++){
            for (int j=0;j<13;j++){
                if (brr[j]==i+1){
                    ss[i]=s[j];
                }
            }
        }
        for (int i=0;i<13;i++){
            System.out.print(ss[i]);
            if (i<12)
                System.out.print(", ");
        }

    }
}

 ps:输出的时候要一个英文 ","再加一个空格

二.质数拆分4

看题:

这题我一开始以为是两个质数相加为2019,可是后来才知道,不是那么简单

简单点说就是:把2019拆分成2个及以上 的不同质数,有多少种拆分方法?

这其实就相当于一个01背包问题,先把比2019小的所有质数求出,然后当成01背包进行运算 

代码如下:

public class 质数拆分 {
    public static void main(String[] args) {
        int s=2;
        int []arr=new int[2020];
        long []brr=new long[2020];
        arr[0]=2;arr[1]=3;
        for (int i=4;i<2020;i++){
            for (int j=2;j<=Math.sqrt(i);j++){
                if (i%j==0)
                    break;
                else if (j+1>Math.sqrt(i)){
                    arr[s]=i;
                    s++;
                }
            }
        }//求出质数数组
        brr[0]=1;
        for (int i=0;i<s;i++){//质数数组长度
            for (int j=2019;j>=arr[i];j--){//每一次取一个质数,来判断带上这个质数后,和前面的质数能合成哪些数字
                //有点累死砝码称重,只不过一个是求合成某个数的方案,一个数求可以合成多少不同的数
                brr[j]+=brr[j-arr[i]];
            }
        }
    }
}

 

三.日志统计

看题看题:

 怎么说呢,自己也写了一下午........

解析:有n条日志,我们可以按照主键ID,次键ts排序

然后一次循环,判断每一个id是不是热文

在循环的时候,注意保持第一个时间点和超过这个时间区间后第一个时间点的更换,以及当下一个编号和当前编号不同时的更改

代码如下:

import java.util.Arrays;
import java.util.Scanner;
public class 日志统计 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//数据个数n
        int d = sc.nextInt();//时间间隔d
        int k = sc.nextInt();//达标个数k
        int[][] arr = new int[n][2];
        int maxs = 0;
        for (int i = 0; i < n; i++) {
            arr[i][0] = sc.nextInt();
            arr[i][1] = sc.nextInt();
        }
        Arrays.sort(arr,((a,b)->{
            if (a[1]!=b[1]){
                return a[1]-b[1];
            }
            return  a[0]-b[0];
        }));
        maxs=arr[n-1][1];
        int t=0,s=-1,y=0,sum=0;
        int []brr=new int[maxs+1];//记录热点编号
        for (int i=0;i<n;i++){//循环
            if (arr[i][1]!=s||brr[s]==1){//和上一个编号不同
                t=arr[i][0];//记录时间
                s=arr[i][1];//记录编号
                y=i+1;//用于之后更改时间
                sum=1;//统计点赞数
                if (sum==k){//以防点赞要求为1
                    brr[s]=1;
                }
            }else if (arr[i][0]>=t+d) {//超过区间
                sum++;//要算上当前点赞
                while (arr[i][0]>=t+d) {//查找下一个不超过区间的位置
                    t = arr[y][0];
                    y++;
                    sum = Math.max(sum-1,1);//以防sum<1;
                }
            }else{
                sum++;
                if (sum==k){//热点
                    brr[s]=1;
                }
            }
        }
        for (int i=0;i<maxs+1;i++){//输出热点
            if (brr[i]==1){
                System.out.println(i);
            }
        }
    }
}

四.递增三元组

看题吧:

解析:

三个数组,直接三个数组进行排序,两轮循环,第一轮循环判断第二个数组比第一个数组的每一个数多的个数,第二轮循环判断第三个数组比第二个数组的每一个数多的个数,然后计算一下第二个数组每一个数的使用次数,和对应的第三个数组对应的大于该数的数相乘求和即可

代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class 递增三元组 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int []arr=new int[n];
        int []brr=new int[n];
        int []crr=new int[n];
        int []drr=new int[n];//brr比arr大的个数
        int []err=new int[n];//crr比brr大的个数
        int []frr=new int[n+1];
        for (int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        for (int i=0;i<n;i++){
            brr[i]=sc.nextInt();
        }
        for (int i=0;i<n;i++){
            crr[i]=sc.nextInt();
        }
        Arrays.sort(arr);
        Arrays.sort(brr);
        Arrays.sort(crr);
        int k=0,y=0;
        for (int i=0;i<n;i++){
            for (int j=k;j<n;j++){//第一轮循环
                if (brr[j]>arr[i]){
                    k=j;
                    drr[i]=n-j;
                    break;
                }
            }
            for (int j=y;j<n;j++){//第二轮循环
                if (crr[j]>brr[i]){
                    y=j;
                    err[i]=n-j;
                    break;
                }
            }
        }
        for (int i=0;i<n;i++){
            frr[n-drr[i]]=i+1;
        }//计算第二个数列的每一个数的使用次数
        long s=0,x=0;
        for (int i=0;i<n;i++){
            x=Math.max(x,frr[i]);
            s+=(err[i]*x);//第三列比第二列每一个数多的个数*第二列对应树使用的次数
        }
        System.out.println(s);
    }
}

五.外卖店优先级 

未解,等!!!

这题还没解出来,两个测试

一个前五个对,50分

一个后三个对,30分

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值