最小化蒙德城的旅行者队伍(巴士)

描述

在阳光明媚的一天,凯亚在蒙德城的风车塔下等待着前往狼的领域的旅行者。他于12:00抵达,并计划在此地逗留一整小时,直至12:59。

蒙德城有许多旅行者的车队,每个车队都有自己的出发时间表。

凯亚观察了这些车队的出发时间,并记录了以下发现:

  1. 在12:00至12:59期间,同一车队的旅行者会以相同的时间间隔到达风车塔。
  2. 每个车队至少有两名旅行者在这一时间段到达。
  3. 不同车队的旅行者可以同时到达风车塔。
  4. 不同车队的旅行者首次到达风车塔的时间和到达的时间间隔都有可能相同。
  5. 测试用例中的车队总数不会超过17个。

请你帮助凯亚编写一个程序,求出在所有旅行者到达风车塔的时刻满足输入数据的要求的情况下,车队的总数量最小是多少。

输入

输入数据第一行包含整数 n,表示在这一小时内抵达到风车塔的旅行者总数量。

第二行包含 n 个整数,表示按升序排序得到的 n 个旅行者的到达时间。

1≤n≤300

输出

输出一个整数,表示最小车队数。

输入样例 1 
17
0 3 5 13 13 15 21 26 27 29 37 39 39 45 51 52 53

输出样例:

3

思路:

最开始我想得是枚举所有的起点然后开始深搜,但是发现这样时间复杂度太高了,所以参考了y总的代码。

先预处理出所有可能的路线:先枚举起点 i,再枚举公差 j。

由于i是起点,因此0 ~ i - 1中不能包含任何该序列的点,所以公差j至少是i + 1;
由于0 ~ 59之间至少要包含两个点,因此i + j一定小于60;

剩下的问题变成:最少从合法线路中选出多少条,才可以覆盖所有给定的公交车。

剪枝:

①由于是枚举组合数,并不是排列数,为了避免重复在DFS时传入当前枚举的起点。
②将所有等差数列按长度排序,优先枚举长度较长的等差数列。这样在搜索树中前几层的分支少,可以更快地发现矛盾然后回溯。
③由于剪枝2的存在,当前路线覆盖的点数是最多的,如果当前路线能覆盖的点数 * 剩余可选的路径条数 + 当前已经覆盖的点数 < 总点数,说明当前方案一定非法,直接回溯即可。

代码实现

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
const int M=60;
int n;
int time[M];//用于记录时间t到达的旅行者的个数
//存储该路径旅行者的个数、起点、差值
vector<pair<int,PII>> routes;bool is_route(int a,int d)
{//判断是否为可行解for(int i=a;i<60;i+=d)if(!time[i])return false;return true;
}
bool dfs(int depth,int u,int sum,int start)
{//sum记录当前已经安排的旅行者人数if(u==depth)return sum==n;//限界函数if(routes[start].first*(depth-u)+sum<n)return false;for(int i=start;i<routes.size();i++){auto r=routes[i];int a=r.second.first,d=r.second.second;//约束函数if(!is_route(a,d))continue;//由于枚举过程中time数组会改变所以要再次判断for(int j=a;j<60;j+=d)time[j]--;if(dfs(depth,u+1,sum+r.first,i))return true;for(int j=a;j<60;j+=d)time[j]++;//恢复现场}return false;
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++){int t;scanf("%d",&t);time[t]++;}//预处理出所有的可能线路for(int i=0;i<60;i++){//枚举起点和差值for(int j=i+1;i+j<60;j++)if(is_route(i,j))routes.push_back({(59-i)/j+1,{i,j}});}//优先枚举长度较长的等差序列,前几层的分支少sort(routes.begin(),routes.end(),greater<pair<int,PII>>());int depth=0;while(!dfs(depth,0,0,0))depth++;printf("%d\n",depth);return 0;
}

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

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

相关文章

【Linux网络】PXE批量网络装机

目录 一、系统装机 1.1 三种引导方式 1.2 系统安装过程 1.3 四大重要文件 二、PXE 2.1 PXE实现原理 2.2 PXE手动搭建过程 2.3 kickstart配合pxe完成批量自动安装 一、系统装机 1.1 三种引导方式 硬盘光驱(U盘)网络启动 1.2 系统安装过程 加载boot loader加载启动安…

Autosar PNC网络管理配置-UserData的使用

文章目录 前言ComComSignalComIPdu CanNmSignal Mapping总结 前言 之前配置的网络管理报文中的data都由ComM管理&#xff0c;后面客户新增了需求&#xff0c;最后两个byte需要发送Wakeup Reason&#xff0c;本文记录一下相关配置的修改 Com ComSignal 之前配置的PN_TX&…

(第12天)【leetcode题解】151、反转字符串中的单词

目录 151、反转字符串中的单词题目描述思路代码本题反思 151、反转字符串中的单词 题目描述 给你一个字符串 s &#xff0c;请你反转字符串中单词的顺序。 单词是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。 返回单词顺序颠倒且单词之间用单个…

Spring MVC:深入剖析与应用实践

Spring MVC&#xff1a;深入剖析与应用实践 文章目录 Spring MVC&#xff1a;深入剖析与应用实践一、引言二、Spring MVC概述三、Spring MVC核心组件四、Spring MVC工作流程五、Spring MVC的设计优势六、Spring MVC面临的挑战七、Spring MVC的应用实践八、Spring MVC的高级特性…

Actions和Mutations

在Vuex中&#xff0c;actions和mutations都是用来改变store中的状态的方法&#xff0c;它们之间的区别如下&#xff1a; Mutations&#xff1a;用于同步地修改state的方法。它们接收state作为第一个参数&#xff0c;并且可以接收额外的参数作为payload。Mutations应该是纯函数&…

Java 线程池 ( Thread Pool )的简单介绍

想象一下&#xff0c;你正指挥着一支超级英雄团队&#xff0c;面对蜂拥而至的敌人&#xff08;任务&#xff09;&#xff0c;不是每次都召唤新英雄&#xff08;创建线程&#xff09;&#xff0c;而是精心调配现有成员&#xff0c;高效应对。这就是Java线程池的魔力&#xff0c;…

Codeforces Round 942 (Div. 2) A-D1

题目&#xff1a; Codeforces Round 942 (Div. 2) D2有缘再补吧… A. Contest Proposal 题意 两个升序&#xff08;不降&#xff09;的序列a和b&#xff0c;可以在a的任意位置插入任意数&#xff08;要保持升序&#xff09;&#xff0c;使对任意i&#xff0c;有a[i] < b[…

28.leetcode---前K个高频单词(Java版)

题目链接: https://leetcode.cn/problems/top-k-frequent-words/description/ 题解: 代码: 测试:

LY/T 3131-2019 木质拼花地板检测

木质拼花地板是指通过单元设计&#xff0c;组拼成具有特定图案的木质地板&#xff0c;按照材料组分分为实木拼花地板&#xff0c;实木复合拼花地板和浸渍纸层压拼花地板。 LY/T 3131-2019 实木拼花地板测试项目 测试项目 测试标准 含水率 GB/T 15036.2 漆膜附着力 GB/T 1…

纯血鸿蒙APP实战开发——底部面板嵌套列表滑动案例

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

自动引流获客软件的魅力

在数字化时代&#xff0c;企业之间的竞争愈发激烈。对于任何一家企业来说&#xff0c;如何有效地吸引潜在客户、提升品牌知名度和销售业绩成为了至关重要的课题。传统的营销手段虽然依旧有效&#xff0c;但随着互联网技术的发展&#xff0c;自动引流获客软件以其独特的魅力&…

iOS - 编译最新 FFMpeg(7.0) SDK

文章目录 一、数据代码准备1、下载 FFMpeg 源码包2、下载 编译脚本3、调整编译脚本二、安装依赖1、安装 brew2、gas-preprocessor3、yams4、x264、FDK-AAC5、其他依赖项三、运行编译1、运行脚本2、结果四、集成到 iOS 工程五、报错信息等

文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题

六、假设 B-TREE-SEARCH 的实现是在每个结点内采用二分查找&#xff0c;而不是线性查找。证明&#xff1a;无论怎样选择 t ( t 为 n 的函数)&#xff0c;这种实现所需的 CPU 时间都为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我…

端口被其他进程占用:OSError: [Errno 98] Address already in use

一、问题描述 错误提示端口号正在被使用 二、解决办法 1.使用 lsof 命令&#xff0c;列出所有正在监听&#xff08;即被绑定&#xff09;的网络连接&#xff0c;包括它们所使用的端口号 sudo lsof -i -P -n | grep LISTEN 2.解绑被绑定的端口号 根据 netstat 或 lsof 命令…

java入门详细教程——day01

目录 1. Java入门 1.1 Java是什么&#xff1f; 1.2 Java语言的历史 1.3 Java语言的分类 1.4 Java语言的特点 1.4.1 先编译再解释运行 1.4.2 跨平台 1.5 JRE和JDK&#xff08;记忆&#xff09; 1.6 JDK的下载和安装&#xff08;应用&#xff09; 1.6.1 下载 1.6.2 安…

今日头条,抖音,西瓜视频你不知道的秘密?

西瓜视频和抖音这两款产品是一家&#xff0c;都是由今日头条孵化。 抖音是由今日头条孵化的一款音乐创意短视频社交软件&#xff0c;该软件于2016年9月20日上线&#xff0c;是一个面向全年龄的音乐短视频社区平台。用户可以通过这款软件选择歌曲&#xff0c;拍摄音乐短视频&am…

04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程 时间版本修改人描述2024年4月22日14:18:59V0.1宋全恒新建文档2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加 简介 前提 准备两台服务&#xff0c;一台部署Docker&#xff0c;一台部署FastBuild的镜像容器服务所述的Docke…

深入剖析Spring框架:推断构造方法与@Bean注解的内部机制

你好&#xff0c;我是柳岸花开。 Spring框架作为Java开发中广泛使用的基础架构&#xff0c;其设计精巧、功能强大&#xff0c;尤其是其依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IoC&#xff09;特性&#xff0c;极大地提高了代码的可维护性和可测试性。本文将…

应用层协议——HTTP协议

1. 认识HTTP协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行在TCP之上。 超文本的意思就是超越普通的文本&#xff0c;http允许传送文字&#xff0c;图片&#xff0c…

嵌入式学习——C语言基础——day15

1. 段错误调试 1.1 打印法 在可能出现错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码 1.2 gbd调试法 1. 编译代码时加入-g选项 gcc filename.c -g 2. 使用gdb调试生成的代码 gdb a.out 3. gdb调试命令 l 查看…