CodeVS3958 火车进站

2023-10-19 00:10
文章标签 火车 进站 codevs3958

本文主要是介绍CodeVS3958 火车进站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3958 火车进站

 

时间限制: 1 s
空间限制: 256000 KB
题目等级 : 大师 Master
题目描述 Description

    火车站内往往设有一些主干线分叉出去的铁路支路,供火车停靠,以便上下客或装载货物。铁路支路有一定长度;火车也有一定的长度,且每列火车的长度相等。 

    假 设某东西向的铁路上,有一小站。该站只有一条铁路支路可供火车停靠,并且该铁路支路最多能容纳M 辆火车。为了火车行驶的通畅,该站只允许火车自东方进站,自西方出站,且先进站的火车必须先出站,否则,站内火车将发生堵塞。该火车站工作任务繁忙。每天 都有 N  辆自东方驶向西方的火车要求在预定时刻进站,并在站内作一定时间的停靠。

    为了满足每辆进站火车的要求,小站的调度工作 是井井有条地开展。在小站每天的工作开始前,小站工作人员须阅读所有火车的进站申请,并决定究竞接受哪些火车的申请。而对于不能满足要求的火车,小站必须 提前通知它们,请它们改变行车路线,以免影响正常的铁路运输工作。由于火车进站、出站的用时可以忽略不计,小站允许几辆火车同时进站或出站,且小站工作人 员可以任意安排这些火车进站的先后排列次序。小站的工作原则是尽量地满足申请火车的要求。 

    请你编一个程序,帮助工作人员考察某天所有火车的进站申请,计算最多能满足多少火车的要求。 

 

输入描述 Input Description

    共N+1 行。 

    第一行是两个正整数N 和M。(N<=100,M<=3); 

    以下N 行每行是一辆火车的进站申请,第i+1 行的两个整数分别表示第i 列火车的进站的时间和火车出站的时间。 

 

输出描述 Output Description

    仅一行,是一个正整数B,表示火车站最多能接纳的火车数量。 

样例输入 Sample Input

     6 3 

     2 4 

     1 7 

     3 6 

     5 7 

     8 10 

     9 11

 

样例输出 Sample Output

     5 

数据范围及提示 Data Size & Hint

祝各位大牛早日AC

【题解】

分情况讨论。

 

m = 1时,dp[i]表示i在站台上的最大进站数。dp[i] = max{dp[j] + 1}; 

要求j在i之前进站且j在i进站前出站

 

m = 2时,dp[i][j]表示i和j正在站台上的最大进站数。dp[i][j] = max{dp[j][k] + 1};

要求k在j前进站,j在i前进站,且k在i进站前出站

 

m = 3时,dp[i][j][k]表示i,j,k正在站台上的最大进站数。dp[i][j][k] = max{dp[j][k][l] + 1};

要求k在j前进站,l在k前进站,j在i前进站,且l在i进站前出站

 

先按进站时间从小到大排序,为了无后效性,从小往大递推。为了判断进站时间相等的若干列车,

i,j,k,l均要从1..n。

50^4数据略大,因此当遇到第一个后面的车进站时间大于前面的车时直接break来减少常数

(实际上常数本来就很小,随便过)

 

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cmath> 
  6 #include <algorithm>
  7 #define min(a, b) ((a) < (b) ? (a) : (b))
  8 #define max(a, b) ((a) > (b) ? (a) : (b))
  9 
 10 inline void read(int &x)
 11 {
 12     x = 0;char ch = getchar(), c = ch;
 13     while(ch < '0' || ch > '9')c = ch, ch = getchar();
 14     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
 15     if(c == '-')x = -x;
 16 }
 17 
 18 const int MAXN = 100 + 10;
 19 
 20 int dp1[MAXN], dp2[MAXN][MAXN], dp3[MAXN][MAXN][MAXN], n, m;
 21 
 22 struct Node
 23 {
 24     int reach, leave;
 25     Node(int _reach, int _leave){reach = _reach, leave = _leave;}
 26     Node(){}
 27 }node[MAXN];
 28 
 29 bool cmp(Node a, Node b)
 30 {
 31     return a.reach == b.reach ? a.leave < b.leave : a.reach < b.reach;
 32 }
 33 
 34 int ans;
 35 
 36 int main()
 37 {
 38     read(n), read(m);
 39     for(register int i = 1;i <= n;++ i) read(node[i].reach), read(node[i].leave);
 40     std::sort(node + 1, node + 1 + n, cmp);
 41     if(m == 1)
 42     {
 43         ans = min(n, 1);
 44         for(register int i = 1;i <= n;++ i)
 45         {
 46             dp1[i] = 1;
 47             for(register int j = 1;j <= n;++ j)
 48             {
 49                 if(node[j].reach > node[i].reach)break;
 50                 if(i == j || node[j].leave > node[i].reach)continue;
 51                 dp1[i] = max(dp1[i], dp1[j] + 1);
 52             }
 53             ans = max(ans, dp1[i]);
 54         }
 55         
 56     }
 57     else if(m == 2)
 58     {
 59         ans = min(2, n);
 60         for(register int i = 1;i <= n;++ i)
 61             for(register int j = 1;j <= n;++ j)
 62             {
 63                 if(node[i].reach < node[j].reach)break;
 64                 if(i == j || node[i].leave < node[j].leave)continue;
 65                 dp2[i][j] = 2;
 66                 for(register int k = 1;k <= n;++ k)
 67                 {
 68                     if(node[k].reach > node[j].reach)break;
 69                     if(j == k || i == k || node[k].leave > node[i].reach || node[k].leave > node[j].leave)continue;
 70                     dp2[i][j] = max(dp2[i][j], dp2[j][k] + 1);
 71                 }
 72                 ans = max(ans, dp2[i][j]); 
 73             }
 74     }
 75     else
 76     {
 77         ans = min(n, 3);
 78         for(register int i = 1;i <= n;++ i)
 79             for(register int j = 1;j <= n;++ j)
 80             {
 81                 if(node[j].reach > node[i].reach)break;
 82                 if(i == j || node[i].leave < node[j].leave)continue; 
 83                 for(register int k = 1;k <= n;++ k)
 84                 {
 85                     if(node[k].reach > node[j].reach)break;
 86                     if(j == k || i == k || node[j].leave < node[k].leave)continue;
 87                     dp3[i][j][k] = 3;
 88                     for(register int l = 1;l <= n;++ l)
 89                     {            
 90                         if(node[l].reach > node[k].reach )break;
 91                         if(l == k || l == i || j == l|| node[l].leave > node[i].reach || node[l].leave > node[k].leave)continue;
 92                         dp3[i][j][k] = max(dp3[i][j][k], dp3[j][k][l] + 1);
 93                     }
 94                     ans = max(ans, dp3[i][j][k]);
 95                 }
 96             }
 97     }
 98     printf("%d", ans);
 99     return 0;
100 }
CodeVS 3958火车进站

 

 

转载于:https://www.cnblogs.com/huibixiaoxing/p/7492800.html

这篇关于CodeVS3958 火车进站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/235996

相关文章

基于Spring Boot的火车订票管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JAVA语言 + Spring Boot框架 工具:IDEA/Eclipse、Navicat、Tomcat 系统展示 首页 管理员界面 用户购票 订单管理 摘要 随着网络技术的不断发展,火车订票管理系统逐渐由传统的线下操作转变为线上服

1hdu022数据结构堆栈-火车进站

/*判断一串序列能否按照堆栈的方式,进出栈之后得到另外一组序列*/ /*要把题目当做已知进出序列进行对比*/ #include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{char st[4];}str[10000];int main(){int n,i,j,t,k,ok

Algorithm学习笔记 --- 铁轨(火车重排问题)

某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号1~n。现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,可以借助中转站C。C是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A→C和C→B。

java实训 | 低配版模拟火车订票系统

代码:  import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.util.ArrayList;import java.util.List;public class TrainBookingSystem {private JFrame frame;private JPanel

今天遇到的3到智力面试题(给工人分金条,小鸟来回在2火车之间飞行的距离,精确称水问题)

智力题1:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费? 答:把金条2次弄断的方式是第一次1,6分,,然后把剩余的6用2,4分,即弄断2次为1段、2段、4段 第一天给1段, 第二天让工人把1段归还给2段, 第三天给1段, 第四天归还1段和2段,给4段。 第五天给1段, 第六天给2

长途火车~48小时记录

1.出门记得带大功率充电宝,最好是50000ma及以上的,不然还没上火车,手机就没电了,电量焦虑症又来了。手机有电就有无限可能。

火车停留 wiki 1035

首先这题N和M都很小,可以往网络流方面想。 怎么用网络流搞呢,其实就是按题目描述搞,cost显然就是费用,而每个站台同一时间只能停一辆车,以及总站台数的限制显然就是流量,想到这里基本上脑子里已经有一个大概的模型了。 1.肯定要拆点,因为涉及到时间,不拆点不能处理时间的前后关系。 2.拆点肯定是按火车拆,因为火车可以随意选择剩下的车站,以车站为点显然不方便。 以上两点想到之后这

关于火车运煤的一些想法

火车运煤也是个经典的问题了。它的定义如下: 你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市? 很多人都知道结果是533.3333。但是这个结果是怎么算出来的,当有400

基于Spring Boot的火车订票管理系统设计与实现

基于Spring Boot的火车订票管理系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图,在系统首页可以查看首页、车次信息、火车资讯、个人中心、后台管理等内容。 车次信息界面图,在车次信息页面通过填写车次名称、火车名称、车牌、图片、起点

L1-086 斯德哥尔摩火车上的题

上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码: s = ''a = '1112031584'for (i = 1; i < length(a); i++) {if (a[i] % 2 == a[i-1] % 2) {s += max(a[i], a[i-1])}}goto_url('www.multisoft.se/' + s)