AtCoder Beginner Contest 142(补题)

2023-05-16

E - Get Everything

链接: link.

题意:

N N N把需要解锁的宝箱,编号为 1 − N 1-N 1N,现在有 M M M把钥匙,每把钥匙价值 a i a_i ai元,每把钥匙可以解锁 b i b_i bi个宝箱,可以解锁的宝箱种类分别为 c i 1 , c i 2 . . . . c i b i c_{i1},c_{i2}....c_{ibi} ci1,ci2....cibi。问你花最少多少钱可以把所有钥匙都解锁

思路:

宝箱的数量较小,可以用2进制状态压缩来表示每个宝箱持有的状态。例如1号宝箱就是 00000001 00000001 00000001,2号就是00000010…依次往后。
现在假设你当前钥匙能开的宝箱的二进制是 n o w now now,当前的钥匙为 i i i号钥匙
定义 d p ( b i t ) dp(bit) dp(bit)为该二进制下解开这些宝箱所需要的最少钱数
那么此时 d p ( b i t ∣ n o w ) = m i n ( d p ( b i t ∣ n o w ) , d p ( b i t ) + a [ i ] ) dp(bit|now)=min(dp(bit|now),dp(bit)+a[i]) dp(bitnow)=min(dp(bitnow),dp(bit)+a[i]),初始状态 d p ( 0 ) = 0 dp(0)=0 dp(0)=0其他的状态初始化为 i n f inf inf,最终答案就是 d p ( ( 1 < < N ) − 1 ) dp((1<<N)-1) dp((1<<N)1)的值

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m;
int a[1111], b[1111];
int c[1111][20];
vector<int> dp(5050, inf);
int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a[i] >> b[i];
        for (int j = 1; j <= b[i]; j++) {
            cin >> c[i][j];
        }
    }
    dp[0] = 0;
    for (int i = 1; i <= m; i++) {
        int now = 0;
        for (int j = 1; j <= b[i]; j++) {
            now |= (1 << (c[i][j] - 1));
        }

        for (int bit = 0; bit < (1 << n); bit++) {
            dp[bit | now] = min(dp[bit | now], dp[bit] + a[i]);
        }
    }
    if (dp[(1 << n) - 1] == inf) {
        puts("-1");
    } else {
        cout << dp[(1 << n) - 1] << endl;
    }
    return 0;
}

F - Pure

链接: link.

题意:

给定一张 N N N个点和 M M M 条边的有向连通图,保证没有重边和自环。现在要找出一个子图,使得子图内每个点的入度和出度都恰好是 1 1 1。输出这个子图。

思路:

子图的每个点的入度和出度都恰好是1,那就说明要找一个环,且这个环中的每个点都是出去一条边,也进来一条边,那么此时只需要找图中的最小环即可,如果不是最小环,可能内部有些点的出度或者入读不是恰好为1,而是 > 1 >1 >1,只有最小环一定是出度入读恰好为1,这个可以用反证法简单证明。找最小环,直接用dfs来跑即可。

#include <bits/stdc++.h>
using namespace std;
const int N = 2222, M = N * 2;
int h[N], e[M], ne[M], idx;
int d[N];
int minv = 0x3f3f3f3f;
int ans[N];
int temp[N];
int n, m;
void add_edge(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; }

void dfs(int u, int root, int dis) {
    temp[dis] = u;
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == root) {
            if (minv > d[u] - d[root] + 1) {
                minv = d[u] - d[root] + 1;
                int id = 0;
                for (int k = d[root]; k <= dis; k++) {
                    ans[id++] = temp[k];
                }
            }
        } else if (!d[j]) {
            d[j] = d[u] + 1;
            dfs(j, root, dis + 1);
        }
    }
}
int main() {
    cin >> n >> m;
    memset(h, -1, sizeof(h));
    while (m--) {
        int a, b;
        cin >> a >> b;
        add_edge(a, b);
    }

    for (int i = 1; i <= n; i++) {
        memset(d, 0, sizeof(d));
        d[i] = 1;
        dfs(i, i, 1);
    }

    if (minv == 0x3f3f3f3f)
        puts("-1");
    else {
        cout << minv << endl;
        for (int i = 0; i < minv; i++) {
            cout << ans[i] << endl;
        }
    }
}

To be continued
如果你有任何建议或者批评和补充,请留言指出,不胜感激

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AtCoder Beginner Contest 142(补题) 的相关文章

随机推荐

  • 第三篇 树莓派的串口通信和语音识别模块

    目录 一 串口 xff08 UART xff09 二 wiringPi提供的串口API 三 语音识别模块 1 阅读模块代码 代码阅读工具 xff1a Souces Insight4 0安装 激活 汉化等 语音识别 xff08 口令模式 xf
  • 安装配置 JupyterLab ubuntu20.04

    目录 编辑 xff08 1 xff09 安装 xff08 2 xff09 配置 xff08 1 xff09 生成配置文件 xff08 2 xff09 生成jupyterlab的登录密码 xff08 3 xff09 修改 jupyter 的配
  • 笔记本安装双系统(win11+centos7)自己遇到坑的总结

    笔记本安装CentOS操作系统 当初在学习CentOS7的时候 就想在自己的笔记本上装一个CentOS7 装CentOS7和Windows双系统 xff0c 安装的过程中也查阅很多资料但是都不是很齐全 xff0c 我将自己安装的全过程总结出
  • 平衡树·splay

    文章目录 1 About splay2 基本操作2 1 数组是干啥的 xff1f 2 2 基本操作 3 splay3 1 rotate函数3 2 splay函数 4 更新操作4 1 插入函数4 2 删除函数 5 查询操作5 1 查询一个数的
  • 删除双系统中的Linux系统(总结以及恢复U盘原样)

    一丶如何删除双系统中的Linux系统 xff08 这里的双系统是win 43 Linux xff09 第一步 首先打开磁盘管理器 xff0c 将要删除的Linux系统的主分区右键点击删除 xff0c 删除后就可以关闭磁盘管理器 第二步 在电
  • centos7安装docker

    一丶先了解下 xff0c 什么是 Docker xff1f 为什么会有 Docker xff1f Docker 的优势 xff1f docker的组成 xff1f 1 为什么会有 Docker xff1f 我们知道一款产品从开发到上线 xf
  • python Anaconda3-下载方法

    一 Anaconda 下载方法 方法一 xff1a 官网下载 xff08 速度特别慢 xff09 下载过程没有技巧 xff0c 全程next xff0c 在路径 上有些小问题解决方法如下 下载Anaconda官网 xff1a https w
  • sinx、cscx、cosx、secx以及tanx、cotx图像详解

    今天在复习三角函数一章中对正切正割等图像感觉比较有意思 xff0c 仔细梳理了以下内容 xff1a sin xff1a sine cos xff1a cosine sec xff1a secant csc xff1a cosecant 首先
  • Debian配置ssh服务

    安装SSH xff0c 工作端口监听在192101 apt install y ssh vim etc ssh sshd config 修改port 192101 仅允许InsideCli客户端进行ssh访问 xff0c 其余所有主机的请求
  • Debian配置DHCP服务及DHCP中继

    Ispsrv服务器上 xff1a Apt install y isc dhcp server 安装完成后 修改dhcp监听网卡 Vim etc default isc dhcp server INTERFACEv4 61 39 要监听的网卡
  • Debian配置NFS文件共享服务

    apt install y nfs kernel server nfs common vim etc exports 添加一条共享文件配置 仅允许AppSrv主机访问该共享 webdata 192 168 100 100 rw sync n
  • Debian搭建Discuz论坛

    论坛服务需要在apache或nginx代理服务已经配置好的情况下搭建 搭建LAMP架构 在前面已经搭建了apache 这里直接安装php apt install y php 安装完成后重启apache systemctl restart a
  • Debian配置ISCSI

    添加一块10G硬盘 apt install y targetcli fb lvm2 使用新增加的硬盘创建卷组 xff0c 名称为iscsivg xff0c 再创建iSCSI共享逻辑卷 xff0c 逻辑卷名称为iscsistore xff0c
  • 链表有序合并C++(头插法)

    include lt stdio h gt include lt stdlib h gt 单链表的存储结构 typedef struct Node int data struct Node next Node LinkList Node L
  • [COCI2010] ZUMA

    题目链接 这道题很明显是一个 d p dp d p 问题 我们先考虑基本状态应该是 f i
  • openstack 配置cinder节点时No package openstack-cinder available No package python-keystone available.的解决

    在cinder节点上键入下面命令 cd etc cinder bash cd etc cinder No such file or directory 我的cinder还没装 xff1f 于是安装一看 root 64 cinder yum
  • openstack Rocky版本安装和配置ceilometer服务教程

    写在前面 1 openstack版本 xff1a rocky 2 linux版本 xff1a centos7 3 确保集群已经安装nova glance keystone等 4 有 符号的是命令 xff0c 没有的是文本 xff0c 本文代
  • Mysql8.0版本修改密码(Linux)

    问题描述 xff1a 此篇文章针对的是Linux服务器上mysql8 0版本的修改密码方式 因为长时间没动到linux服务器的mysql xff0c 导致自己当初里面设置的密码是啥 上网找了很多资料去修改重置了一下mysql的密码 xff0
  • 【Python自动化测试】python实现PC客户端自动化快速入门:pywinauto

    python 实现 PC 客户端自动化 xff1a pywinauto 快速上手 xff01 一 前言 近期有部分小可爱在问PC端自动化怎么去做 xff1f 对这个技术比较好奇 xff0c 使用python可以不可以实现PC客户端自动化测试
  • AtCoder Beginner Contest 142(补题)

    E Get Everything 链接 link 题意 xff1a 有 N N N 把需要解锁的宝箱 xff0c 编号为 1 N