CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家


前言

在这里插入图片描述



餐馆

在这里插入图片描述

思路:可撤销的0-1背包

考察了多个知识点,包括

  • 差分技巧
  • 离线思路
  • 0-1背包

不过这题卡语言,尤其卡python

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {

    static final long mod = (long)1e9 + 7;

    public static void main(String[] args) {
        AReader scanner = new AReader();
        PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

        // 读取n和v
        int n = scanner.nextInt();
        int v = scanner.nextInt();

        // 读取并处理物品信息
        List<int[]> packs = new ArrayList<>();
        List<int[]> ops = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int s = scanner.nextInt();
            int e = scanner.nextInt();
            int w = scanner.nextInt();
            packs.add(new int[]{s, e, w});
            ops.add(new int[]{s, 1, w});
            ops.add(new int[]{e + 1, -1, w});
        }

        // 对ops按时间排序
        ops.sort(Comparator.comparingInt(a -> a[0]));

        // 读取q和查询时间
        int q = scanner.nextInt();
        int[] arr = IntStream.range(0, q).map(i -> scanner.nextInt()).toArray();

        // 将查询和索引关联起来
        List<int[]> qs = IntStream.range(0, q).mapToObj(i -> new int[]{arr[i], i}).collect(Collectors.toList());
        qs.sort(Comparator.comparingInt(a -> a[0]));

        // 互斥的两类
        long[] dp1 = new long[v + 1];
        long[] dp2 = new long[v + 1];

        // 初始化dp2
        dp2[0] = 1;
        for (int[] pack : packs) {
            int s = pack[0];
            int w = pack[2];
            for (int m = v - w; m >= 0; m--) {
                dp2[m + w] += dp2[m];
                dp2[m + w] %= mod;
            }
        }
        dp1[0] = 1;

        // 双指针,离散做法
        int p1 = 0;
        int p2 = 0;
        int[][] res = new int[q][2];
        for (int i = 0; i < 101; i++) { // 假设结束时间不超过arr[q-1]
            while (p1 < ops.size() && ops.get(p1)[0] <= i) {
                int[] op = ops.get(p1);
                int d = op[1];
                int w = op[2];
                if (d == 1) {
                    add01(dp1, w, v);
                    remove01(dp2, w, v);
                } else {
                    remove01(dp1, w, v);
                    add01(dp2, w, v);
                }
                p1++;
            }

            // 找到fz和bz
            int fz = 0;
            for (int j = v; j >= 0; j--) {
                if (dp1[j] > 0) {
                    fz = j;
                    break;
                }
            }
            int bz = 0;
            for (int j = v - fz; j >= 0; j--) {
                if (dp2[j] > 0) {
                    bz = j;
                    break;
                }
            }

            // 填充结果
            while (p2 < qs.size() && qs.get(p2)[0] <= i) {
                res[qs.get(p2)[1]][0] = fz;
                res[qs.get(p2)[1]][1] = bz;
                p2++;
            }
        }

        // 输出结果
        for (int[] pair : res) {
            out.println(pair[0] + " " + pair[1]);
        }
        out.flush();
        out.close();
    }

    private static void add01(long[] dp, int w, int v) {
        for (int u = v - w; u >= 0; u--) {
            dp[u + w] += dp[u];
            dp[u + w] %= mod;
        }
    }

    private static void remove01(long[] dp, int w, int v) {
        for (int u = 0; u <= v - w; u++) {
            dp[u + w] -= dp[u];
            dp[u + w] = (dp[u + w] % mod + mod) % mod;
            // 注意:在Java中,如果dp[u]是0或负数,可能需要额外的逻辑来避免负数
        }
    }

    static
    class AReader {
        private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        private StringTokenizer tokenizer = new StringTokenizer("");
        private String innerNextLine() {
            try {
                return reader.readLine();
            } catch (IOException ex) {
                return null;
            }
        }
        public boolean hasNext() {
            while (!tokenizer.hasMoreTokens()) {
                String nextLine = innerNextLine();
                if (nextLine == null) {
                    return false;
                }
                tokenizer = new StringTokenizer(nextLine);
            }
            return true;
        }
        public String nextLine() {
            tokenizer = new StringTokenizer("");
            return innerNextLine();
        }
        public String next() {
            hasNext();
            return tokenizer.nextToken();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
        public long nextLong() {
            return Long.parseLong(next());
        }
    }

}

python 版本被卡常

# coding=utf-8
# coding=utf-8
import sys
input=sys.stdin.buffer.readline

n, v = list(map(int, input().split()))

ops = []
packs = []
for i in range(n):
    s, e, w = list(map(int, input().split()))
    packs.append((s, e, w))
    ops.append((s, 1, w))
    ops.append((e + 1, -1, w))
ops.sort(key=lambda x: x[0])

t1, t2 = 100, 0
q = int(input())
arr = list(map(int, input().split()))
qs = []
for i in range(q):
    qs.append((arr[i], i))
    t1 = min(t1, arr[i])
    t2 = max(t2, arr[i])
qs.sort(key=lambda x: [0])

# 互斥的两类
dp1 = [0] * (v + 1)
dp2 = [0] * (v + 1)

#--------------------------------

dp2[0] = 1
for (s, e, w) in packs:
    for m in range(v - w, -1, -1):
        dp2[m + w] += dp2[m]

dp1[0] = 1

def add01(dp, w):
    for u in range(v - w, -1, -1):
        dp[u + w] += dp[u]

def remove01(dp, w):
    for u in range(0, v - w + 1):
        dp[u + w] -= dp[u]

# 双指针,离散做法
res = [[]] * q
p1, p2 = 0, 0
for i in range(t1, t2 + 1):
    while p1 < len(ops) and ops[p1][0] <= i:
        d = ops[p1][1]
        if d == 1:
            add01(dp1, ops[p1][2])
            remove01(dp2, ops[p1][2])
        elif d == -1:
            remove01(dp1, ops[p1][2])
            add01(dp2, ops[p1][2])
        p1 += 1

    # print (i, dp1, dp2)

    fz = max([i for i in range(v + 1) if dp1[i] > 0])
    bz = max([i for i in range(v + 1) if dp2[i] > 0 and i <= (v - fz)])

    while p2 < len(qs) and qs[p2][0] <= i:
        res[qs[p2][1]] = (fz, bz)
        p2 +=  1

# for (fz, bz) in res:
#     print (fz, bz)

print ("\n".join(map(lambda x: str(x[0]) + " "+ str(x[1]), res)))

写在最后

在这里插入图片描述

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

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

相关文章

前端实习记录——git篇(公司拉取项目流程)

实习中第一步就是拉取项目&#xff0c;看项目代码&#xff0c;下面总结一下我在公司项目拉取项目流程。 1、联系leader开通gitlab账号 2、查看/配置git用户名和密码 &#xff08;1&#xff09;查看 git config user.name git config user.email git config user.password &…

python基础-数据结构-leetcode刷题必看-heapq --- 堆队列算法,TopK问题

文章目录 堆堆的定义堆的主要操作堆的构建堆排序heapq模块heapq.heappush(heap, item)heapq.heappop(heap)heapq.heappushpop(heap, item)heapq.heapreplace(heap, item)heapq.merge(*iterables, keyNone, reverseFalse)heapq.nlargest(n, iterable, keyNone)heapq.nsmallest(n…

【移除链表元素】python

目录 题目&#xff1a; 方法&#xff1a; 知识&#xff1a; 代码&#xff1a; 题目&#xff1a; 方法&#xff1a; 在头节点前增加一个虚拟头节点 知识&#xff1a; 链表中的每一个节点只包含当前值val和指向下一个next 代码&#xff1a; class Solution:def removeEle…

AI新时代——【深度学习】驱动的【AIGC大模型】与【机器学习】的创新融合

目录 1.机器学习与人工智能的基础 1.机器学习的基本原理 2.人工智能的广泛应用 2.深度学习的崛起 1.深度学习的概念和原理 2.卷积神经网络&#xff08;CNN&#xff09; 3.循环神经网络&#xff08;RNN&#xff09; 3.AIGC大模型的创新 1.AIGC的概念和应用 2.代表性AI…

网络侦察技术

网络侦察技术 收集的信息网络侦察步骤搜索引擎检索命令bing搜索引擎Baidu搜索引擎Shodan钟馗之眼(zoomeye) whois数据库&#xff1a;信息宝库查询注册资料 域名系统网络拓扑社交网络跨域拓展攻击 其它侦察手段社会工程学社会工程学常见形式Web网站查询 其它非技术侦察手段总结网…

连接远程的kafka【linux】

# 连接远程的kafka【linux】 前言版权推荐连接远程的kafka【linux】一、开放防火墙端口二、本地测试是否能访问端口三、远程kafka配置四、开启远程kakfa五、本地测试能否连接远程六、SpringBoot测试连接 遇到的问题最后 前言 2024-5-14 18:45:48 以下内容源自《【linux】》 仅…

如何使用宝塔面板搭建Tipask问答社区网站并发布公网远程访问

文章目录 前言1.Tipask网站搭建1.1 Tipask网站下载和安装1.2 Tipask网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试4.结语 前…

S32K --- FLS MCAL配置

一、前言 二、MCAL配置 添加一个Mem_43_infls的模块, infls是访问内部flash, exfls是访问外部flash 2.1 General 这边暂时保持的默认,还没详细的去研究,等有空研究了,我再来更新 2.2 MemInstance 双金“index”的下标“0”可以进里面详细配置,这个是基本操作了。 2.2.1 G…

面试问到Spring中的@Autowired注解,可以这样答

前言 在Spring框架中&#xff0c;依赖注入是一个核心概念&#xff0c;它允许将一个对象的依赖关系外部化并由Spring容器来管理。Autowired注解是实现这一点的关键工具之一。当然&#xff0c;这块知识也是面试官们老生常谈的问题。 下面就跟着博主的步伐&#xff0c;一起来探讨…

Three.js是基于原生WebGL封装的三维引擎

Three.js: 基于原生WebGL封装的三维引擎 引言 随着互联网技术的发展&#xff0c;Web前端技术不断进步&#xff0c;用户对于网页交互体验的要求也越来越高。艾斯视觉前端开发&#xff1a;三维技术作为提升用户体验的重要手段之一&#xff0c;正在逐渐成为前端开发中的热门技术…

PyTorch张量索引用法速查

作为数据科学家或软件工程师&#xff0c;你可能经常处理大型数据集和复杂的数学运算&#xff0c;这些运算需要高效且可扩展的计算。PyTorch 是一个流行的开源机器学习库&#xff0c;它通过 GPU 加速提供快速灵活的张量计算。在本文中&#xff0c;我们将深入研究 PyTorch 张量索…

纷享销客当选江西省数字经济学会首席信息官专业委员会副主任委员

5月11日&#xff0c;江西省数字经济学会首席信息官(CIO)专业委员会成立大会暨“新质生产力”企业数字化转型论坛在南昌香格里拉大酒店隆重举行。 江西省工业和信息化厅作为指导单位&#xff0c;由江西省数字经济学会、南昌市中小企业服务局主办&#xff0c;金蝶软件&#xff0…

单值二叉树(oJ题)

一、题目连接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、题目思路 遍历左右子树&#xff0c;如果左子树存在不为空并且根结点的值不等于左子树的值&#xff0c;返回false, 如果右子树存在不为空并且根结点的值不等于右子树的值&#xff0c;返回false, 每一个…

了解VS安全编译选项GS

缓冲区溢出攻击的基本原理就是溢出时覆盖了函数返回地址&#xff0c;之后就会去执行攻击者自己的函数&#xff1b; 针对缓冲区溢出时覆盖函数返回地址这一特征&#xff0c;微软在编译程序时使用了安全编译选项-GS&#xff1b; 目前版本的Visual Studio中默认启用了这个编译选项…

MT2075 礼物

思路&#xff1a; x,y为质数&#xff0c;若x2,y3&#xff0c;则xy的最小公倍数6既不能给A也不能给B。 所以假设共有V个数&#xff0c;在1-V中&#xff0c;可以选的个数为&#xff1a;V-⌊V/(x*y)⌋ 个。&#xff08;⌊V/(x*y)⌋为V个数中有多少个xy的公倍数&#xff09; 所以…

Kibana使用教程

Kibana使您能够轻松地向Elasticsearch发送请求&#xff0c;并以交互方式分析、可视化和管理数据。 1.安装 1.1 docker安装Kibana 如果你还没安装Elasticsearch&#xff0c;先执行docker安装Elasticsearch&#xff0c;下面是单机部署。 创建一个ES网络&#xff1a; docker n…

信息系统项目管理师0137:输出(8项目整合管理—8.9结束项目或阶段—8.9.3输出)

点击查看专栏目录 文章目录 8.9.3 输出8.9.3 输出 项目文件(更新)可在结束项目或阶段更新所有项目文件,并标记为最终版本。特别值得注意的是,经验教训登记册的最终版本要包含阶段或项目收尾的最终信息。最终版本的经验教训登记册可包含:效益管理、项目评估的准确性、项目和…

Spring和Servlet的整合

Servlet对象是谁创建的&#xff1f; 由服务器端创建的 程序启动调用加载spring配置文件代码 Web应用程序启动也需要加载Spring配置文件 Web开发中有三大组件&#xff1a; 1、servlet 2、filter 3、listener&#xff08;request&#xff0c;session&#xff0c;application&…

(4)医疗图像处理:MRI磁共振成像-成像技术--(杨正汉)

目录 一、特殊成像技术 1.水成像技术 2.化学位移成像技术 二、成像辅助技术 1.脂肪抑制技术 2.磁化转移技术 3.流动补偿技术 4.空间饱和空间标记技术 5.生理门控及导航回波技术 所有的这些技术最终就是为了使得K空间通过傅里叶变化之后得到的图片变的更为清晰。 一、…

React Hooks是如何保存的

React 函数式组件是没有状态的&#xff0c;需要 Hooks 进行状态的存储&#xff0c;那么状态是怎么存储的呢&#xff1f;Hooks是保存在 Fiber 树上的&#xff0c;多个状态是通过链表保存&#xff0c;本文将通过源代码分析 Hooks 的存储位置。 创建组件 首先我们在组件中添加两…