0
点赞
收藏
分享

微信扫一扫

【蓝桥杯】每日一题冲刺国赛

钵仔糕的波波仔 2022-03-14 阅读 84

今日学习📃

 🎋1、巧拼扑克牌

package Day_Day_work;

/**
 * @author yx
 * @date 2022-03-13 10:17
 */

public class 巧排扑克牌 {
// 1:输出是逗号+空格
        public static void main(String[] args) {
            System.out.print("7, A, Q, 2, 8, 3, J, 4, 9, 5, K, 6, 10");
    }
}

 🎃2、质数拆分

package Day_Day_work.problem;
/**
 * @author yx
 * @date 2022-03-13 10:52
 */
public class 质数拆分__01背包问题 {
    static long[] a=new long[2020];
    static int[] p=new int[2020];
    public static void main(String[] args) {
            a[0]=1;
            int n=1;
            for(int i=1;i<2019;i++)
            {
                if(pd(i))
                {
                    p[n++]=i;
                }
            }
        /**
         * 下面是01动规核心代码
         */
        for(int i=1;i<=n-1;i++) {
                for(int j=2019;j>=p[i];j--) {
                    a[j] += a[j-p[i]];
                }
            }
            System.out.println(a[2019]);
    }

    static boolean pd(int x) {//质数判断
        if(x==1)
        {
            return false;
        }
        for(int i=2;i<=(int) Math.sqrt(x);i++)
        {
            if(x%i==0)
            {
                return false;
            }
        }
        return true;
    }
}

🖼️3、日志统计 

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
1
3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
package Day_Day_work;

import java.util.*;

/**
 * @author yx
 * @date 2022-03-13 15:19
 */
public class 日志统计__尺取法 {
    static class R{
        int ts;//时刻
        int td;//id
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N=scanner.nextInt(),D=scanner.nextInt(),K=scanner.nextInt();
        R[] rs=new R[N];
        for (int i = 0; i < N; i++) {
            R r=new R();
            r.ts=scanner.nextInt();
            r.td=scanner.nextInt();
            rs[i]=r;
        }
        //匿名内部类定义排序器
        Arrays.sort(rs, new Comparator<R>() {
            @Override
            public int compare(R o1, R o2) {
                return o1.ts-o2.ts;//表示按时刻的升序来排列
            }
        });
        //用于给id计点赞数
        Map<Integer,Integer> cnt=new HashMap<>();
        //用于存储答案,TreeSet自动对集合中的元素进行升序排序
        SortedSet<Integer> answer=new TreeSet<Integer>();
        /*
          尺取法
         */
        int j=0;
        for (int i = 0; i < N; i++) {
            while (j<N&&rs[j].ts-rs[i].ts<D){//左闭右开,时间区间不能超过D
                int td=rs[j].td;
                Integer exist=cnt.get(td);
                if(exist!=null){//不为空的情况下
                    cnt.put(td,exist+1);//该id的点赞次数+1
                }else {//最开始的情况
                    cnt.put(td,1);//该id第一次出现,直接给赋值为1
                }
                if(cnt.get(td)>=K){//当点赞次数超过K时加入到answer集合中
                    answer.add(td);
                }
                j++;//往后继续取区间
            }
            //退出while循环后,i往后移动会+1,则当前的i的点赞数-1,因为后面的区间最小值为i+1
            //不包括i,将该id下的点赞数-1
            Integer c=cnt.get(rs[i].td);//获取该id下的点赞数
            if(c!=null){
                cnt.put(rs[i].td,c-1);//更新点赞数
            }
        }
        for (Integer i:answer) {
            System.out.println(i);
        }
    }
}

🎄4、递增三元组

package Day_Day_work;

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

/**
 * @author yx
 * @date 2022-03-13 16:02
 */
public class 递增三元组 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int A[] = new int[N];
        int B[] = new int[N];
        int C[] = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = scanner.nextInt();
        }
        for (int i = 0; i < N; i++) {
            B[i] = scanner.nextInt();
        }
        for (int i = 0; i < N; i++) {
            C[i] = scanner.nextInt();
        }
        //计数
        int a = 0;
        int b = 0;
        int c = 0;
        //升序排列
        Arrays.sort(A);
        Arrays.sort(B);
        Arrays.sort(C);
        int j = 0;
        int k = 0;
        long ans=0;
        for (int i = 0; i < N; i++) {
            while (j<N&&A[j]<B[i])j++;
            while (k<N&&C[k]<=B[i])k++;
            ans+=(long) (N-k)*j;
        }
        System.out.println(ans);
    }
}

🎍5、外卖店优先级

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
1

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 256M
package Day_Day_work;
import java.util.Scanner;

/**
 * @author yx
 * @date 2022-03-13 19:42
 */
/*
仔细读题:
1、优先级最低减到 0
2、优先级大于 5,则会被系统加入优先缓存(进入优先缓存后还有可能被移除)

思路:
1、先模拟,再全部遍历
 */
public class 外卖店优先__暴力模拟 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N=scanner.nextInt();//M行数据输入
        int M=scanner.nextInt();//N家店
        int T=scanner.nextInt();//给定的一个时刻
        int A[][]=new int[N][T];
        int ans=0;//计数
        for (int i = 0; i < M; i++) {
            int ts=scanner.nextInt();//输入时刻
            int id=scanner.nextInt();//输入店的id
            A[id-1][ts-1]+=1;//表示这家店来了一个订单
        }
        for (int i = 0; i < N; i++) {//对每一家店做处理
            int level=0;//优先级
            boolean k=false;//是否能够加入优先缓存
            for (int i1=0;i1<T;i1++){
                if(A[i][i1]==0){//表示没有订单
                    level-=1;
                    if(level<0){
                        level=0;
                    }
                    if (level<=3){
                        k=false;
                    }
                }else {
                    level+=(2*A[i][i1]);
                    if(level>5){
                        k=true;
                    }
                }
            }
            if(k){
                ans++;
            }
        }
        System.out.println(ans);
    }
}

💖写在最后

每日一题,我们一直在路上,这次的题目有点小难度,比较有挑战性

也充分认识到了自己的不足,比如说在动规背包问题上的薄弱,博主接下来将有针对性地加强训练

“心若有所向往,何惧道阻且长,各位有志青年,一起加油 !”

欢迎一起交流讨论!

 

举报

相关推荐

0 条评论