http://noi.openjudge.cn/——4.7算法之搜索——【169:The Buses】

题目

169:The Buses
总时间限制: 5000ms 内存限制: 65536kB
描述
A man arrives at a bus stop at 12:00. He remains there during 12:00-12:59. The bus stop is used by a number of bus routes. The man notes the times of arriving buses. The times when buses arrive are given.
Buses on the same route arrive at regular intervals from 12:00 to 12:59 throughout the entire hour.
Times are given in whole minutes from 0 to 59.
Each bus route stops at least 2 times.
The number of bus routes in the test examples will be <=17.
Buses from different routes may arrive at the same time.
Several bus routes can have the same time of first arrival and/or time interval. If two bus routes have the same starting time and interval, they are distinct and are both to be presented.

Find the schedule with the fewest number of bus routes that must stop at the bus stop to satisfy the input data. For each bus route, output the starting time and the interval.
输入
Your program is to read from standard input. The input contains a number n (n <= 300) telling how many arriving buses have been noted, followed by the arrival times in ascending order.
输出
Your program is to write to standard output. The output contains one integer, which is the fewest number of bus routes.
样例输入
17
0 3 5 13 13 15 21 26 27 29 37 39 39 45 51 52 53
样例输出
3
来源
IOI 1994

翻译

描述
一名男子于12:00到达公交车站。他在12:00-12:59期间留在那里。公共汽车站被许多公共汽车路线使用。
那人记下了到达的公共汽车的时间。公共汽车到达的时间已经给出。
同一路线的公共汽车在整个小时内从12:00到12:59定期到达。
时间以0到59的整分钟为单位。
每条公交线路至少停靠2次。
测试示例中的公交线路数量将<=17。
不同路线的巴士可能会同时到达。
多条公交线路可以具有相同的首次到达时间和/或时间间隔。如果两条公交线路的出发时间和间隔相同,
则它们是不同的,并且都要呈现。
找到必须在公交车站停靠的公交线路数量最少的时刻表,以满足输入数据。对于每条公交线路,输出起始时间和间隔。

输入
您的程序将从标准输入读取。
输入包含一个数字n(n=300),表示记录了多少辆到达的公交车,
后面是按升序排列的到达时间。

输出
您的程序将写入标准输出。输出包含一个整数,这是最少的公交线路数量。

理解

1.每个停靠时间都能划归一条线路
2.每个没归入线路的停靠时间都可以作为一个公交小路
3.公交线路的两个相邻停靠时间间隔一样
4.停靠的次数不能少于2,也就是只有一次差。任何两个停靠之间都可以作为一线路
5.如果所有的时间线都找到线路就算搞定

代码(参考网上找到的代码)

#include <bits/stdc++.h>
using namespace std;
struct Stop_time{//停靠一次
int time,//时间点
id,//哪个公交线路
m;//该时间点停靠了几个线路
}stop_time[60];
struct Bus_line{//公交线路
int first,//首次停靠时间
time,//间隔时间
m;//该线路停靠总次数
Bus_line(){};
Bus_line(int firstx,int timex,int mx){first=firstx,time=timex,m=mx;};
bool operator<(Bus_line b){
return m>b.m;
}
}bus[900];
int n,//共停靠次数
x_time,//输入停靠时间
bus_m,//可能线路总数
ans=17;//题目给定的最多公交线路,找最少的
void view1(string s){
cout<<s<<endl;
cout<<“首停时间”<<“\t间隔时间”<<“\t停靠车数”<<endl;
for(int i=0;i<bus_m;i++)cout<<bus[i].first<<“\t\t”<<bus[i].time<<“\t\t”<<bus[i].m<<endl;
}
void view2(int x){
cout<<“线路”<<x<<“\t首次停靠时间:”<<bus[x].first<<“\t间隔时间:”<<bus[x].time<<“\t停靠次数”<<bus[x].m<<endl;
cout<<“时间\t”;for(int i=0;i<60;i++)if(stop_time[i].time)cout<<i<<“\t”;cout<<endl;
//cout<<“有停靠\t”;for(int i=0;i<60;i++)if(stop_time[i].time)cout<<stop_time[i].time<<“\t”;cout<<endl;
cout<<“停几车\t”;for(int i=0;i<60;i++)if(stop_time[i].time)cout<<stop_time[i].m<<“\t”;cout<<endl;
cout<<“线路\t”;for(int i=0;i<60;i++)if(stop_time[i].time)cout<<stop_time[i].id<<“\t”;cout<<endl;
}
int check(int first,int time){//判断该线路是否成立
if(first>=time)return 0;//初始停靠时间超过往返时间,意味着不是首次停靠,不是始发
int total=0;//总共停靠次数
for(int i=first;i<60;i+=time){//遍历所有时间
total++;
if(stop_time[i].m= =0)return 0;//如果某个时间点没有停靠,该线路不成立
}
return total;
}
//go(线路序号,哪个线路,已定线路数,确定了几个停靠时间)
void go(int id,int x,int num,int total){
if(total==n){ans=min(ans,num);return;}
for(int i=x;i<bus_m;i++){//从大到小,先用多的线路
if(num+(n-total)/bus[i].m>=ans)return;//已定线路数+剩余停靠次数/该线路所用停靠次数>最少线路数
if(check(bus[i].first,bus[i].time)){//判定该线路所需停靠时间被前面线路用了没
for(int j=bus[i].first;j<60;j+=bus[i].time){
stop_time[j].m–;//该线路占用停靠时间
stop_time[j].id=id;//该线路占用停靠时间
}
//view2(i);
go(id+1,i,num+1,total+bus[i].m);//递归,多个线路,多该线路的停靠次数。
for(int j=bus[i].first;j<60;j+=bus[i].time){
stop_time[j].m++;//该线路占用停靠时间
stop_time[j].id=0;//该线路占用停靠时间
}
}
}
}
int main(){
freopen(“data.cpp”,“r”,stdin);
cin>>n;
for(int i=0;i<n;i++){
cin>>x_time;
stop_time[x_time].m++;
stop_time[x_time].time=x_time;
}
for(int i=0;i<30;i++)//线路始时间
for(int time=i+1;time<60-i;time++){//该线路往返周期
int total=check(i,time);
if(total)bus[bus_m++]=Bus_line{i,time,total};
}
//view1(“排序前”);
sort(bus,bus+bus_m);//为找最少线路,从停靠次数最多线路开始
//view1(“排序后”);
//go(线路序号,哪个线路,共几个线路,占用了几个停靠时间)
go(1,0,0,0);
cout<<ans;
return 0;
}

所有可能线路

在这里插入图片描述

结果

在这里插入图片描述

小结

该题递归本身不难,难的是不超时。
特别关键的思路,是先找到所有可能的线路,停靠时间间隔一样的线路,间隔不能小于第一次停靠的时间,起码得停靠两次。
并且以此为可能线路的判断。
以停靠次数为序降序排序。
递归遍历所有线路,每次从线路始停时间,间隔时间,消除所有停靠时间。
对,线路的预选,线路的判断是难点。

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

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

相关文章

java基础概念59-File

一、路径 二、File类 2-1、常见的构造方法 示例&#xff1a; 【注意】&#xff1a; 一般不自己用分割符把父路径和子路径拼接起来&#xff0c;因为&#xff0c;不用的操作系统&#xff0c;分隔符不同。 2-2、小结 2-3、File中常见的成员方法 示例&#xff1a; 【注意】&#…

PortSwigger靶场练习---第二关-查找和利用未使用的 API 端点

第二关&#xff1a;Finding and exploiting an unused API endpoint 实验&#xff1a;查找和利用未使用的 API 端点 PortSwigger靶场地址&#xff1a; Dashboard | Web Security Academy - PortSwigger 题目&#xff1a; 官方提示&#xff1a; 在 Burp 的浏览器中&#xff0c…

软路由系统iStoreOS 一键安装 docker compose

一键安装命令 大家好&#xff01;今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令&#xff0c;当前版本是 V2.32.4。如果你需要最新版本&#xff0c;可以查看获取docker compose最新版本号 部分&#xff0c;获取最新版本号后替换命令中的版本号即可。 w…

SpringCloud nacos 2.0.0 + seata 2.0.0

NACOS 下载nacos https://github.com/alibaba/nacos/releases/tag/2.2.0 启动nacos startup.cmd -m standalone SEATA 下载seata https://seata.apache.org/release-history/seata-server 新建数据库-seata CREATE TABLE branch_table (branch_id bigint NOT NULL,xid …

springboot音乐播放器系统

Spring Boot音乐播放器系统是一个基于Spring Boot框架开发的音乐播放平台&#xff0c;旨在为用户提供高效、便捷的音乐播放体验。 一、系统背景与意义 随着互联网的飞速发展和人们对音乐娱乐需求的不断增长&#xff0c;音乐播放器已经成为人们日常生活中不可或缺的一部分。传…

奉加微PHY6230兼容性:部分手机不兼容

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

如果这是您阅读的本专栏的第一篇博文&#xff0c;建议先阅读如何安装Visual Studio 2022。 C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 一、简单准备 开始学习、编写程序…

数字艺术类专业人才供需数据获取和分析研究

本文章所用数据集&#xff1a;数据集 本文章所用源代码&#xff1a;源代码和训练好的模型 第1章 绪论 1.1研究背景及意义 随着社会经济的迅速发展和科技的飞速进步&#xff0c;数字艺术类专业正逐渐崛起&#xff0c;并呈现出蓬勃发展的势头。数字艺术作为创作、设计和表现形式的…

imbinarize函数用法详解与示例

一、函数概述 众所周知&#xff0c;im2bw函数可以将灰度图像转换为二值图像。但MATLAB中还有一个imbinarize函数可以将灰度图像转换为二值图像。imbinarize函数是MATLAB图像处理工具箱中用于将灰度图像或体数据二值化的工具。它可以通过全局或自适应阈值方法将灰度图像转换为二…

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

Codeforces Round 997 (Div. 2) A~C

今天的封面是水母猫猫和佩佩&#xff0c;原图在这里&#xff0c;记得关注画师夏狩大大 至此&#xff0c;天鹅完成了连续四场比赛在四个不同比赛上四次分的壮举&#xff01;&#xff08;ABC388&#xff0c;CodeChef169&#xff0c;牛客月赛109&#xff0c;CF997&#xff09; 这场…

JavaFx + SpringBoot 快速开始脚手架

JavaFX系列项目模板 JDK8 & JavaFX & SpringBoot 加持SpringBoot&#xff0c;项目示例&#xff0c;Maven打包插件带可执行程序JDK8 & JavaFX 不依赖SpringBoot&#xff0c;项目示例&#xff0c;Maven打包插件带可执行程序JDK11 & JavaFX15 使用 jlink 打包为精…

蓝桥杯3525 公因数匹配 | 枚举+数学

题目传送门 这个题目是一个数学题&#xff0c;由于只需要找到存在大于1的公因数的两数&#xff0c;所以比较方便的做法是统计每一个数的&#xff08;质&#xff09;因数。可以通过筛法统计质因数降低复杂度&#xff0c;但是直接枚举因数也可以满足要求。使用字典记录每个因数出…

当PHP遇上区块链:一场奇妙的技术之旅

PHP 与区块链的邂逅 在技术的广袤宇宙中&#xff0c;区块链技术如同一颗耀眼的新星&#xff0c;以其去中心化、不可篡改、透明等特性&#xff0c;掀起了一场席卷全球的变革浪潮。众多开发者怀揣着对新技术的热忱与探索精神&#xff0c;纷纷投身于区块链开发的领域&#xff0c;试…

利用Ai,帮我完善了UsbCamera App的几个界面和设置功能

早些时候&#xff0c;我有开源了一个UsbCamera App的代码&#xff0c;后来因为一些原因&#xff0c;就只针对星球成员和课程视频成员开源了。最近&#xff0c;我对这个App进行了一些内容的补充。 主要是添加了一些设置相关的内容&#xff0c;支持rtmp推流、循环录像、镜像&…

【系统分享01】Python+Vue电影推荐系统

大家好&#xff0c;作为一名老程序员&#xff0c;今天我将带你一起走进电影推荐系统的世界&#xff0c;分享如何利用 Django REST Framework 和 Vue 搭建一套完整的电影推荐系统&#xff0c;结合 协同过滤算法&#xff0c;根据用户评分与影片喜好&#xff0c;精准推送用户可能喜…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘

准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker Desktop [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 seafile 参考资料 Docker安装 Seafile OnlyOffice 并配置OnlyOffice到Seafile&#xff0c;实现在线编辑…