【备战秋招】每日一题:4月29日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

news2025/1/11 21:58:36

 为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第二题-限行

在线评测链接:P1267

题目内容

塔子哥是一个富有的商人,他在一家大型贸易公司工作。他的公司位于城市的中心区,是一座高耸的摩天大楼。他住在郊区的别墅,是一座豪华的欧式建筑。他每天都要开车上下班,穿越城市的繁华和拥堵。

不幸的是,这个城市为了缓解交通拥堵,实行了限行规则,每天都有一些车牌号的最后一位数字被禁止上路。

塔子哥不想因为限行而迟到或者请假,因为他的工作很重要,涉及到很多国际贸易的合同和谈判。所以他想买几辆车,让他每天都有车可以用。

假设他不能换车牌号,也不能选择其他交通方式,而且他的工作时间是固定的,问他至少需要买多少辆车?如果没有办法做到,就输出 −1 。

输入描述

输入一共有 7 行,表示周一至周日的限行情况。

输入每一行,第 i 行的第一个数字 c_i 表示当天限行数字个数,随后输入c*_i个互不相同的数字,第 j 个数字为 a_*{ij} ,表示限行数字。

对于所有的数据, 0\le c_i \le 10, 0\le a_{ij} \le 9

输出描述

输出为一个整数,表示塔子哥需要的最少车辆数或塔子哥不能保证每天都至少有一辆车可以出行。

样例

输入

8 0 1 2 3 4 5 6 7
8 1 2 3 4 5 6 7 8
8 2 3 4 5 6 7 8 9
8 0 1 2 3 4 5 8 9
8 0 1 2 3 6 7 8 9
8 0 1 4 5 6 7 8 9
8 2 3 4 5 6 7 8 9

输出

5

样例解释

一种可能的方案是,选购最后车牌一位数字分别为 0,2,4,6,8 的 5 辆车,此时每天都有车辆可以出行。

思路

二进制状态压缩

将车牌 0 到 9 分别看成 2^02^9,即二进制表示十进制数的存在与否。如此 [0, 1023] 就可以表示 0 到 9 是否存在了。

bit_i 表示第 i 天允许通行的车牌号。

所以只要枚举 [1, 1023] 这些车牌号的状态表示,然后对满足任意一天都可以有车牌通行的所有车牌状态表示,计算这些状态表示的车牌的数量,并取个\min,每辆车都有不同的车牌号,故这就是最少的车牌数量就是需要的车的数量。

时间复杂度:O(n\times 2^n), n = 10

视频实况 v1, 08:18-21:06

类似题目推荐

LeetCode

  1. 78. 子集

  2. 2151. 基于陈述统计最多好人数

  3. 1601. 最多可达成的换楼请求数目

  4. 2002. 两个回文子序列长度的最大乘积

CodeFun2000

P1188 2023.04.12-微众银行春招-第三题-魔法收纳器 - 难度较大

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
int bit[10];
int c[7];
​
int main()
{
    for (int i = 0; i < 7; ++i) {
        scanf("%d", &c[i]);
        for (int j = 0, x; j < c[i]; ++j) {
            // 先将第 i 天限行的每个尾号用二进制记录下来
            scanf("%d", &x);
            bit[i] |= 1 << x;
        }
        // 通过 1111 1111 11 这个二进制表示全部尾号,减去限行的尾号,就是第 i 天不限行的尾号表示
        bit[i] = (1 << 10) - 1 - bit[i];
    }
​
    int ans = -1;
    // 枚举所有可能拥有的尾号表示
    for (int i = 1; i < 1 << 10; ++i) {
        int cnt = 0;
        for (int j = 0; j < 10; ++j) {
            if (i >> j & 1) cnt += 1;
        }
​
        // 判断拥有的尾号与 7 天每天的不限行尾号是否有交集
        // 如果都有交集就说明这个尾号表示是合法的
        // 如果存在至少 1 天与这个尾号表示无交集,就说明这个尾号表示是不合法的
        bool ok = true;
        for (int j = 0; j < 7; ++j)
            if ((i & bit[j]) == 0) {
                ok = false;
                break;
            }
        
        // 如果合法,取最少的尾号数量
        if (ok) {
            if (ans == -1) ans = cnt;
            else ans = min(ans, cnt);
        }
    }
​
    printf("%d\n", ans);
    return 0;
}

python

bit = [0] * 7
for i in range(7):
    lst = list(map(int, input().split()))
    for j in range(1, len(lst)):
        # 先将第 i 天限行的每个尾号用二进制记录下来
        bit[i] |= 1 << lst[j]
    # 通过 1111 1111 11 这个二进制表示全部尾号,减去限行的尾号,就是第 i 天不限行的尾号表示
    bit[i] = 1023 - bit[i]
​
ans = -1
# 枚举所有可能拥有的尾号表示
for i in range(1, 1024):
    cnt = 0
    
    for j in range(10):
        if i >> j & 1:
            cnt += 1
    # 判断拥有的尾号与 7 天每天的不限行尾号是否有交集
    # 如果都有交集就说明这个尾号表示是合法的
    # 如果存在至少 1 天与这个尾号表示无交集,就说明这个尾号表示是不合法的
    ok = True
    for j in range(7):
        if (bit[j] & i) == 0:
            ok = False
            break
    # 如果合法,取最少的尾号数量
    if ok:
        if ans == -1:
            ans = cnt
        else:
            ans = min(ans, cnt)
​
print(ans)

Java

import java.util.Scanner;
​
class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] bit = new int[7];
        for (int i = 0; i < 7; ++i) {
            int c = sc.nextInt();
            for (int j = 0; j < c; ++j) {
                int x = sc.nextInt();
                // 先将第 i 天限行的每个尾号用二进制记录下来
                bit[i] |= 1 << x;
            }
            // 通过 1111 1111 11 这个二进制表示全部尾号,减去限行的尾号,就是第 i 天不限行的尾号表示
            bit[i] = 1023 - bit[i];
        }
​
        int ans = -1;
        // 枚举所有可能拥有的尾号表示
        for (int i = 1; i <= 1023; ++i) {
            int cnt = 0;
            for (int j = 0; j < 10; ++j) {
                if (((i >> j) & 1) == 1) cnt += 1;
            }
​
            // 判断拥有的尾号与 7 天每天的不限行尾号是否有交集
            // 如果都有交集就说明这个尾号表示是合法的
            // 如果存在至少 1 天与这个尾号表示无交集,就说明这个尾号表示是不合法的
            boolean ok = true;
            for (int j = 0; j < 7; ++j) {
                if ((bit[j] & i) == 0) {
                    ok = false;
                    break;
                }
            }
            
            // 如果合法,取最少的尾号数量
            if (ok) {
                if (ans == -1) ans = cnt;
                else ans = Math.min(ans, cnt);
            }
        }
​
        System.out.println(ans);
    }
}

Go

package main
​
import (
    "fmt"
)
​
func main() {
    bit := make([]int, 7)
    c := make([]int, 7)
    for i := 0; i < 7; i++ {
        fmt.Scan(&c[i])
        for j := 0; j < c[i]; j++ {
            var x int
            fmt.Scan(&x)
            // 先将第 i 天限行的每个尾号用二进制记录下来
            bit[i] |= 1 << x
        }
        // 通过 1111 1111 11 这个二进制表示全部尾号,减去限行的尾号,就是第 i 天不限行的尾号表示
        bit[i] = (1 << 10) - 1 - bit[i]
    }
​
    ans := -1
    // 枚举所有可能拥有的尾号表示
    for i := 1; i < 1<<10; i++ {
        cnt := 0
        for j := 0; j < 10; j++ {
            if i>>j&1 == 1 {
                cnt++
            }
        }
        // 判断拥有的尾号与 7 天每天的不限行尾号是否有交集
        // 如果都有交集就说明这个尾号表示是合法的
        // 如果存在至少 1 天与这个尾号表示无交集,就说明这个尾号表示是不合法的
        ok := true
        for j := 0; j < 7; j++ {
            if i&bit[j] == 0 {
                ok = false
                break
            }
        }
​
        // 如果合法,取最少的尾号数量
        if ok {
            if ans == -1 {
                ans = cnt
            } else {
                ans = min(ans, cnt)
            }
        }
    }
​
    fmt.Println(ans)
}
​
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    const bit = new Array(7);
    const c = new Array(7);
    let index = 0;
    for (let i = 0; i < 7; i++) {
        const line = lines[index++].split(' ');
        c[i] = line[0];
        bit[i] = 0;
        for (let j = 0; j < c[i]; j++) {
            // 先将第 i 天限行的每个尾号用二进制记录下来
            const x = line[j + 1];
            bit[i] |= 1 << x;
        }
        // 通过 1111 1111 11 这个二进制表示全部尾号,减去限行的尾号,就是第 i 天不限行的尾号表示
        bit[i] = (1 << 10) - 1 - bit[i];
    }
​
    let ans = -1;
    // 枚举所有可能拥有的尾号表示
    for (let i = 1; i < 1 << 10; ++i) {
        let cnt = 0;
        for (let j = 0; j < 10; ++j) {
            if ((i >> j) & 1) cnt += 1;
        }
​
        // 判断拥有的尾号与 7 天每天的不限行尾号是否有交集
        // 如果都有交集就说明这个尾号表示是合法的
        // 如果存在至少 1 天与这个尾号表示无交集,就说明这个尾号表示是不合法的
        let ok = true;
        for (let j = 0; j < 7; ++j) {
            if ((i & bit[j]) == 0) {
                ok = false;
                break;
            }
        }
​
        // 如果合法,取最少的尾号数量
        if (ok) {
            if (ans == -1) {
                ans = cnt;
            } else {
                ans = Math.min(ans, cnt);
            }
        }
    }
​
    console.log(ans);
});

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码审计——SSRF详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击&#xff08;SSRF&#xff09;也成为跨站点端口攻击&#xff0c;是由于一些应用在向第三方主机请求资源时提…

Linux 学习记录33(网络编程篇)

Linux 学习记录33(网络编程篇) 本文目录 Linux 学习记录33(网络编程篇)一、阻塞IO二、非阻塞IO三、信号驱动IO四、IO多路复用(重点)1. select (TCP服务器)TCP服务器代码TCP客户端代码 2. poll 一、阻塞IO 1. 最常用&#xff0c;最简单&#xff0c;效率最低的. 2. 创建套接字文…

WPF开发txt阅读器11:自定义控件更改音量语速

文章目录 自定义控件控件调用自定义事件更改音量和语速 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f4…

【Java】Java核心要点总结 65:TreeSet 两种排序

文章目录 1. Comparable 和 Comparator区别比较2. TreeSet有两种实现指定排序规则的方式&#xff1a; 1. Comparable 和 Comparator区别比较 Comparable 是排序接口&#xff0c;若一个类实现了Comparable接口&#xff0c;就意味着“该类支持排序”。Comparator 是比较器&#x…

使用post请求建立长连接实现sse,接收后端主动发来的消息,实现chat-gpt的弹字效果,EventSource的应用

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 最近在做一个chat相关的功能&#xff0c;然后由于接口返回特别特别慢&#xff0c;所以需要搞一个慢慢等待的效果&#xff0c;就是接口一个单词一个单词的返回&#xff0c;然后前端收到一个展示一个&#xff0c…

Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 6 - EXTI外部中断的使用 1、简述 开发板蓝色按键连接PC13管脚&#xff0c;且断开时为高电平&#xff0c;闭合时低电平。我们将pc13设置为中断模式&#xff0c;低电平触发&#xff0c;当按键按下时&#xff0c;触发中…

Hadoop完全分布式运行环境的搭建

Hadoop完全分布式运行环境的搭建 文章目录 Hadoop完全分布式运行环境的搭建0. 写在前面1. 模板虚拟机环境准备安装模板虚拟机hadoop01虚拟机配置要求如下关闭防火墙&#xff0c;关闭防火墙开机自启创建普通用户配置新用户权限修改所属主和所属组卸载虚拟机自带的JDK重启虚拟机 …

【备战秋招】每日一题:4月23日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第四题-01串的代价 在线评测链接:P1248 题目内容 塔子哥是一个喜欢研究密码的人&#xff0c;他经常在网上寻找各种有趣的密码挑战。他最近发现了一个神秘的网站&#xff…

指定字符串数组中每个元素sn的长度L如果sn长度比L短,则补充空格,且sn居中如果sn长度比L长,则保留sn左侧L个字符

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定字符串数组中每个元素sn的长度L 如果sn长度比L短&#xff0c;则补充空格,且sn居中 如果sn长度比L长&#xff0c;则保留sn左侧L个字符 [太阳]选择题 下列代码最后输出的结果是&#xff1f…

基于Java在线购物系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

MindFusion.Java Swing Pack 2023.R1 Crack

MindFusion.Java Swing Pack 2023.R1 改进了图表、电子表格和虚拟键盘。 6月 15&#xff0c; 2023 - 16&#xff1a;06 新版本 特征 MindFusion.Diagramming 的新功能 空间索引 - 创建项目位置索引&#xff0c;以便更快地进行命中测试和视口裁剪查询。这极大地提高了包含数…

ch8_1_CPU的结构和功能

1. cpu的结构 1.1CPU 的功能 控制器的功能 控制器的功能具体作用取指令指令控制分析指令操作控制执行指令&#xff0c; 发出各种操作命令控制程序输入与结果的输出时间控制总线管理处理中断处理异常情况和特殊请求数据加工 运算器的功能 实现算术运算 和 逻辑运算&#x…

基于Java多角色学生管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

基于Java网上服装销售系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【大数据】可视化仪表板 - Superset的安装和使用

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

11-高性能JSON库——fastjson2

目录 1.具体使用 1.1.添加fastjson2依赖 1.2.常用类和方法 1.3.将JSON字符串转换成对象 1.3.1.JSON字符串转换成对象 1.3.2.JSON字符串转换成数组 1.4.将对象转换成JSON字符串 1.4.1.将对象转换成JSON字符串 1.4.2.将数组转换成 JSON 字符串 2.性能测试报告 3.总结 …

浪潮发布G2平台

2017年2月28日下午&#xff0c;浪潮在北京粤财JW万豪酒店以“智变”为主题&#xff0c;发布新一代智能存储平台G2&#xff0c;该平台基于统一架构和In系列智能软件设计&#xff0c;在保障”三高”特性满足企业级关键数据存储、处理需求的同时&#xff0c;更强调数据生命周期的智…

第六章 部署WSUS及RDS服务

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 适用范围&#xff1a;Windows Server 2022、Windows Server…

揭密ChatGPT背后团队鲜为人知的小秘密

ChatGPT引领的人工智能技术浪潮还在持续火爆&#xff0c;可是做出这款产品的OpenAI公司&#xff0c;熬得住多年的冷板凳&#xff0c;最终一飞冲天&#xff0c;他们是怎么做到的呢&#xff1f; 因此&#xff0c;我对这家企业的组织建设产生了浓厚的兴趣。我找啊找&#xff0c;最…

游戏开发日志13(利用PlayerPrefs来存储数据)

为游戏设置一个音量键&#xff0c;可以自由选择背景音乐是否开启&#xff0c;并且保存这个设置。 设计了UI如下&#xff1a; 其中BGM为Toggle&#xff0c;其余四个为Button 在canvas&#xff08;set&#xff09;上添加两个脚本&#xff1a;GameMnue&#xff0c;GameManage p…