AtCoder Beginner Contest 331 题解 A-E

A - Tomorrow

原题链接

题目描述
已知一年有M个月D天,求出第ymd天的后一天是哪一天。

思路:分类讨论

  • 分别讨论md的是否是最后一个月或者最后一天即可。
public static void solve() throws IOException {
    int n = readInt(), m = readInt();
    int a = readInt(), b = readInt(), c = readInt();
    if (c < m) {
        printWriter.println(a + " " + b + " " + (c + 1));
    } else {
        if (b == n) {
            printWriter.println((a + 1) + " "  + 1 + " " + 1);
        } else {
            printWriter.println(a + " " + (b + 1) + " " + 1);
        }
    }
}

B - Buy One Carton of Milk

原题链接

题目描述
一家超市正在销售鸡蛋。一包 6 6 6个鸡蛋售价 S S S日元,一包 8 8 8个鸡蛋售价 M M M日元,一包 12 12 12个鸡蛋售价 L L L日元。你可以购买任意数量的每包鸡蛋,求至少购买 N N N个鸡蛋所需的最小金额。

思路:枚举

  • 分别枚举每包鸡蛋购买的数量,求出最小值。
public static void solve() throws IOException {
    int n = readInt();
    int a = readInt(), b = readInt(), c = readInt();
    int min = Integer.MAX_VALUE;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= n; j++) {
            for (int k = 0; k <= n; k++) {
                if (i * 6 + j * 8 + k * 12 >= n) {
                    min = Math.min(min, i * a + b * j + c * k);
                }
            }
        }
    }
    printWriter.println(min);
}

C - Sum of Numbers Greater Than Me

原题链接

题目描述
给你一个长度为 N N N 的序列 A = ( A 1 , … , A N ) A=(A_1,\ldots,A_N) A=(A1,,AN)。对于每个 i = 1 , … , N i=1,\ldots,N i=1,,N,求出 A A A 中所有大于 A i A_i Ai 的元素之和。

思路:排序+前缀和+二分

  • 对于每个 A i A_i Ai,求出它在排序好的数组中,后面比它大的数的和即可,具体看代码注释。
public static void solve() throws IOException {
    int n = readInt();
    int[] arr = new int[n + 1];
    int[] arr2 = new int[n + 1];
    for (int i = 1; i <= n; i++) {
        arr[i] = readInt();
        arr2[i] = arr[i];
    }
    Arrays.sort(arr2, 1, n + 1);
    long[] pre = new long[n + 1];
    for (int i = 1; i <= n; i++) {
        pre[i] = pre[i - 1] + arr2[i];// 前缀和
    }
    for (int i = 1; i <= n; i++) {
        int l = 0, r = n + 1;
        // 二分找到 arr[i]在 arr2中最后一次出现的位置
        while (l + 1 < r) {
            int mid = l + r >> 1;
            if (arr2[mid] <= arr[i]) {
                l = mid;
            } else {
                r = mid;
            }
        }
        if (l == 0 || r == n + 1) {// arr[i]已经最大
            printWriter.print(0 + " ");
        } else {
            printWriter.print((pre[n] - pre[l]) + " ");
        }
    }
}

D - Tile Pattern

原题链接

题目描述
有一个无穷大的正方形网格。网格中的每个方格都是黑色或白色的。方格 ( i , j ) (i, j) (i,j) 的颜色由字符 P [ i   m o d   N ] [ j   m o d   N ] P[i \bmod N][j \bmod N] P[imodN][jmodN] 表示,其中 B 表示黑色,W 表示白色。这里, a   m o d   b a \bmod b amodb表示 a a a 除以 b b b 的余数。然后给出 Q Q Q个查询, 每个查询给出四个整数 A , B , C , D A, B, C, D A,B,C,D,要求你找出以 ( A , B ) (A, B) (A,B)为左上角, ( C , D ) (C, D) (C,D)为右下角的矩形区域中包含的黑色方格的个数

思路:前缀和

  • 先根据已给出的 n × n n \times n n×n 的网格计算出前缀和。
  • 然后可以根据 A , B , C , D A, B, C, D A,B,C,D将图形分为四个区域,且让四区域的左上角都为 ( 0 , 0 ) (0, 0) (0,0),右下角分别为 ( A − 1 , B − 1 ) , ( A − 1 , D ) , ( C , B − 1 ) , ( C , D ) (A-1,B-1),(A-1,D),(C,B-1),(C,D) (A1,B1),(A1,D),(C,B1),(C,D)
    在这里插入图片描述
  • 分好区域后,又可以将每个区域分为四部分。假设一个区域有 r r r c c c 列,那么 ①左上角有 ( r / n ) ∗ ( c / n ) (r / n) * (c / n) (r/n)(c/n) n ∗ n n * n nn大小的网格,②右上角有 ( r / n ) (r/n) (r/n) n ∗ ( c % n ) n * (c \% n) n(c%n)大小的网格,③左下角有 ( c / n ) (c/n) (c/n) ( r % n ) ∗ n (r \% n) * n (r%n)n大小的网格,④右下角有一个 ( r % n ) ∗ ( c % n ) (r \% n) * (c \% n) (r%n)(c%n)大小的网格。
  • 最后再通过前缀和的方式得到 ( A , B ) (A, B) (A,B)为左上角, ( C , D ) (C, D) (C,D)为右下角的矩形区域中包含的黑色方格的个数。
static int n, q;
static long[][] pre;

public static void solve() throws IOException {
    n = readInt(); q = readInt();
    pre = new long[n + 1][n + 1];
    for (int i = 1; i <= n; i++) {
        String s = (" " + readString());
        for (int j = 1; j <= n; j++) {
            if (s.charAt(j) == 'B') pre[i][j] = 1;
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            pre[i][j] += pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1];
        }
    }

    while (q-- > 0) {
        int a = readInt() + 1, b = readInt() + 1;// 左上角
        int c = readInt() + 1, d = readInt() + 1;// 右下角
        printWriter.println(calc(c, d) - calc(c, b - 1) - calc(a - 1, d) + calc(a - 1, b - 1));
    }
}

public static long calc(int r, int c) {
    long sum = 0;
    sum += 1l * (r / n) * (c / n) * pre[n][n];// 左上
    sum += 1l * (r / n) * pre[n][c % n];// 右上
    sum += 1l * (c / n) * pre[r % n][n];// 左下
    sum += 1l * pre[r % n][c % n];// 右下
    return sum;
}

E - Set Meal

原题链接

题目描述
一家餐厅出售的饭菜包括一道主菜和一道配菜。 主菜有 N N N 种,主菜 i i i 的价格为 a i a_i ai 日元。 配菜有 M M M 种,配菜 i i i 的价格为 b i b_i bi 日元。套餐由一道主菜和一道配菜组成,价格为所选主菜和配菜价格的总和。
但是餐厅不提供 L L L 对不同的由主菜 c i c_i ci 和配菜 d i d_i di 组成的套餐。也就是说,餐厅只提供了 N ∗ M − L N * M - L NML 份套餐。请你求出可以提供的最贵套餐的价格

思路:排序+多路归并

  • 将主菜和配菜降序排序,再构建一个大顶堆,实现多路归并。
  • 先让每个主菜与第一个配菜组成套餐,即入队。
  • 寻找答案:如果堆顶元素可以组成套餐,那么输出答案,否则让该主菜和下一个配菜组成套餐,入队。
public static void solve() throws IOException {
    int n = readInt(), m = readInt(), L = readInt();
    Pair[] a = new Pair[n], b = new Pair[m];
    for (int i = 0; i < n; i++) a[i] = new Pair(i, readInt());
    for (int i = 0; i < m; i++) b[i] = new Pair(i, readInt());
    Arrays.sort(a, (p, q) -> q.second - p.second);// 降序
    Arrays.sort(b, (p, q) -> q.second - p.second);
    Map<Integer, Set<Integer>> map = new HashMap<>();// 不提供的套餐
    for (int i = 0; i < L; i++) {
        int c = readInt() - 1, d = readInt() - 1;
        Set<Integer> set = map.getOrDefault(c, new HashSet<>());
        set.add(d);
        map.put(c, set);
    }
	// 大顶堆,按照 a[i] + b[j]降序排序
    PriorityQueue<int[]> deque = new PriorityQueue<>((p, q) -> {
        return a[q[0]].second + b[q[1]].second - (a[p[0]].second + b[p[1]].second);
    });
    for (int i = 0; i < n; i++) {
        deque.offer(new int[]{i, 0});
    }
    // 注意入队时,使用排序好的数组下标
    // 计算时,使用原数组的下标
    while (deque.size() > 0) {
        int[] t = deque.poll();
        if (!map.getOrDefault(a[t[0]].first, new HashSet<>()).contains(b[t[1]].first)) {
            printWriter.println(a[t[0]].second + b[t[1]].second);
            return;
        }
        if (t[1] + 1 < m) {// 下一个配菜
            deque.offer(new int[]{t[0], t[1] + 1});
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的旅游信息网【源码好优多】

简介 旅游信息网是一款介绍旅游相关内容的网站&#xff0c;分为前台和后台部分&#xff0c;其中前台用户注册以后可以浏览景点、景点详情、预订景点、酒店、车票、保险、以及浏览旅游攻略、个人信息修改、在线留言等&#xff0c;管理员在后台对景点、攻略、订单信息、酒店信息、…

oj赛氪练习题

数组调整 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int k scanner.nextInt();int[] arr new int[n];for (int i 0; i < n; i) {arr[i] scanner.nextIn…

java源码-类与对象

1、面向对象与面向过程 在了解类和对象之前我们先了解一下什么是面向过程和面向对象。 1&#xff09;面向过程编程&#xff1a; C语言就是面向过程编程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 2&#xff09;面向对…

Redis 发布订阅机制深入探索

Redis 的发布订阅&#xff08;pub/sub&#xff09;机制是一种消息传递模式&#xff0c;允许消息的发送者&#xff08;发布者&#xff09;和消息的接收者&#xff08;订阅者&#xff09;通过一个中介层&#xff08;频道&#xff09;进行通信&#xff0c;而无需彼此直接交互。以下…

半导体工艺发展概述

集成电路发展到今天&#xff0c;经历从1940年的PN结发现&#xff0c;到1950年BJT三极管发明&#xff0c;再到1963年CMOS电路发明。从单纯基于Si的半导体电路&#xff0c;再到GaAs, GaN&#xff0c;SiGe, InP等化合物半导体集成电路。不断的通过化学材料配比&#xff0c;基本单元…

TinyVue 组件库助力赛意信息获得工业软件种子奖

首先恭喜广州赛意信息科技股份有限公司荣获工业软件种子奖&#xff01;在本次大赛中&#xff0c;凭借“数据驱动智造&#xff0c;基于 iDME 的赛意新一代 SMOM 赋能电子行业制造运营管理解决方案”这一作品脱颖而出~ 大赛简介 10月30日至10月31日&#xff0c;由广东省工业和信…

圆通速递查询入口,以表格的形式导出单号的每一条物流信息

批量查询圆通速递单号的物流信息&#xff0c;以表格的形式导出单号的每一条物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击…

Hadoop——分布式计算MapReduce和资源调度Yarn

分布式计算 MapReduce YARN架构 YARN集群部署 一、Hadoop安装目录下/etc/hadoop修改mapred-env配置文件&#xff0c;mapred-site.xml文件 二、etc/hadoop文件内&#xff0c;修改yarn-env.sh&#xff0c;yarn-site.xml 三、将配置好的文件分发到其他服务节点 start-dfs.…

SLAM ORB-SLAM2(10)轨迹跟踪过程

SLAM ORB-SLAM2(10)轨迹跟踪过程 1. 总体过程2. ORB 特征点提取2.1. 相机数据处理2.1.1. 单目相机图像处理2.1.2. 双目相机图像处理2.1.3. RGBD相机图像处理2.2. ORB 特征点3. 地图初始化3.1. 坐标形式3.2. 坐标原点3.3. 地图尺度4. 相机位姿初始估计4.1. 关键帧4.2. 运动模型…

文件搜索神器—Everything,结合内网穿透秒变在线搜索神器!

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

【每日一题】1423. 可获得的最大点数-2023.12.3

题目&#xff1a; 1423. 可获得的最大点数 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有…

【Android】解决安卓中并不存在ActivityMainBinding

安卓中并不存在ActivityMainBinding这个类&#xff0c;这个类是在XML布局的最外层加入就会自动生成。但是你在最后绑定主布局时会报错获取不到根节点getRoot(). 最好的办法就是&#xff0c;删除原来的最外层节点&#xff0c;再重新添加&#xff0c;感觉是因为复制时并没有让系…

[蓝桥杯 2020 省 AB1] 解码

做题前思路&#xff1a; 1.因为是多组输入&#xff0c;又包含字符于是我们可以先定义一个char类型数组arr 2.定义数组的长度&#xff1a;题目说简写&#xff08;字母加数字&#xff09;长度不超过100&#xff0c;但原来的长度可能超过100&#xff0c;加上小明不会将连续超过9…

Pandas时序数据分析实践—基础(1)

目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型&#xff08;int&#xff09;&#xff1a;2.1.2. 浮点数类型&#xff08;float&#xff09;&#xff1a;2.1.3. 布尔类型&#xff08;bool&#xff09;&#xff1a;2.1.4. 字符串类型&#xff08;object&a…

树_对称二叉树

//给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 // // // // 示例 1&#xff1a; // // //输入&#xff1a;root [1,2,2,3,4,4,3] //输出&#xff1a;true // // // 示例 2&#xff1a; // // //输入&#xff1a;root [1,2,2,null,3,null,3] //输出…

JVM内存结构:StringTable与常量池关系

首先看一道题 这就涉及到StringTable和常量池&#xff0c;答案在文末&#xff0c;全做对就不用看了 而StringTable的位置在不同版本也有变化 &#xff0c; 我们只探讨jdk1.8版本 与StringTable 串池对应的是常量池 案例一、常量池和串池联系 引用所指肯定不会是常量池中的字…

vue3中如何实现事件总线eventBus

使用插件 由于vue3中 “$ on”&#xff0c;$ off 和 $ once 实例方法已被移除&#xff0c;组件实例不再实现事件触发接口 所以我们可以使用官方推荐的这个第三方库实现同样的效果 mitt https://github.com/developit/mitt 安装 pnpm install mitt -S挂载全局写法 main.ts 初始…

机械专业个人简历17篇

以下简历内容以机械专业相关岗位招聘需求为背景&#xff0c;我们整理了17篇且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴&#xff0c;助理大家在众多候选人中脱颖而出。 机械专业简历模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xf…

使用python streamlit库快速创建一个购物网站

streamlit Streamlit 是一个基于 Python 的 Web 应用程序框架&#xff0c;致力于以更高效、更灵活的方式可视化数据&#xff0c;并分析结果。 Streamlit是一个开源库&#xff0c;可以帮助数据科学家和学者在短时间内开发机器学习 (ML) 可视化仪表板。只需几行代码&#xff0c…

封装了一个顺滑嵌套滚动的框架

首先查看效果图 就是开始滚动的时候&#xff0c;上面的头部和下面的内容是 一起滚动的&#xff0c;但是当滚动到segment 的时候&#xff0c;segment 是悬停 的&#xff0c;下面的tableView是分区的 架构设计 我们设计一个架构&#xff0c;以下面的tablView为主体&#xff0…