CodeVS3958 火车进站
3958 火车进站
火车站内往往设有一些主干线分叉出去的铁路支路,供火车停靠,以便上下客或装载货物。铁路支路有一定长度;火车也有一定的长度,且每列火车的长度相等。
假 设某东西向的铁路上,有一小站。该站只有一条铁路支路可供火车停靠,并且该铁路支路最多能容纳M 辆火车。为了火车行驶的通畅,该站只允许火车自东方进站,自西方出站,且先进站的火车必须先出站,否则,站内火车将发生堵塞。该火车站工作任务繁忙。每天 都有 N 辆自东方驶向西方的火车要求在预定时刻进站,并在站内作一定时间的停靠。
为了满足每辆进站火车的要求,小站的调度工作 是井井有条地开展。在小站每天的工作开始前,小站工作人员须阅读所有火车的进站申请,并决定究竞接受哪些火车的申请。而对于不能满足要求的火车,小站必须 提前通知它们,请它们改变行车路线,以免影响正常的铁路运输工作。由于火车进站、出站的用时可以忽略不计,小站允许几辆火车同时进站或出站,且小站工作人 员可以任意安排这些火车进站的先后排列次序。小站的工作原则是尽量地满足申请火车的要求。
请你编一个程序,帮助工作人员考察某天所有火车的进站申请,计算最多能满足多少火车的要求。
共N+1 行。
第一行是两个正整数N 和M。(N<=100,M<=3);
以下N 行每行是一辆火车的进站申请,第i+1 行的两个整数分别表示第i 列火车的进站的时间和火车出站的时间。
仅一行,是一个正整数B,表示火车站最多能接纳的火车数量。
6 3
2 4
1 7
3 6
5 7
8 10
9 11
5
祝各位大牛早日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来减少常数
(实际上常数本来就很小,随便过)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b)) inline void read(int &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const int MAXN = + ; int dp1[MAXN], dp2[MAXN][MAXN], dp3[MAXN][MAXN][MAXN], n, m; struct Node
{
int reach, leave;
Node(int _reach, int _leave){reach = _reach, leave = _leave;}
Node(){}
}node[MAXN]; bool cmp(Node a, Node b)
{
return a.reach == b.reach ? a.leave < b.leave : a.reach < b.reach;
} int ans; int main()
{
read(n), read(m);
for(register int i = ;i <= n;++ i) read(node[i].reach), read(node[i].leave);
std::sort(node + , node + + n, cmp);
if(m == )
{
ans = min(n, );
for(register int i = ;i <= n;++ i)
{
dp1[i] = ;
for(register int j = ;j <= n;++ j)
{
if(node[j].reach > node[i].reach)break;
if(i == j || node[j].leave > node[i].reach)continue;
dp1[i] = max(dp1[i], dp1[j] + );
}
ans = max(ans, dp1[i]);
} }
else if(m == )
{
ans = min(, n);
for(register int i = ;i <= n;++ i)
for(register int j = ;j <= n;++ j)
{
if(node[i].reach < node[j].reach)break;
if(i == j || node[i].leave < node[j].leave)continue;
dp2[i][j] = ;
for(register int k = ;k <= n;++ k)
{
if(node[k].reach > node[j].reach)break;
if(j == k || i == k || node[k].leave > node[i].reach || node[k].leave > node[j].leave)continue;
dp2[i][j] = max(dp2[i][j], dp2[j][k] + );
}
ans = max(ans, dp2[i][j]);
}
}
else
{
ans = min(n, );
for(register int i = ;i <= n;++ i)
for(register int j = ;j <= n;++ j)
{
if(node[j].reach > node[i].reach)break;
if(i == j || node[i].leave < node[j].leave)continue;
for(register int k = ;k <= n;++ k)
{
if(node[k].reach > node[j].reach)break;
if(j == k || i == k || node[j].leave < node[k].leave)continue;
dp3[i][j][k] = ;
for(register int l = ;l <= n;++ l)
{
if(node[l].reach > node[k].reach )break;
if(l == k || l == i || j == l|| node[l].leave > node[i].reach || node[l].leave > node[k].leave)continue;
dp3[i][j][k] = max(dp3[i][j][k], dp3[j][k][l] + );
}
ans = max(ans, dp3[i][j][k]);
}
}
}
printf("%d", ans);
return ;
}
CodeVS 3958火车进站
CodeVS3958 火车进站的更多相关文章
- 华为OJ:火车进站
火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...
- (hdu)1022 Train Problem I 火车进站问题
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 Problem Description As the new term comes, ...
- C++ HOJ 火车进站
[问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入: 有多组 ...
- HDU 1022 火车进站【栈】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意: 题目大概意思:有N辆火车,以序列1方式进站,判断是否能以序列2方式出栈.进站不一定 ...
- 华为OJ—火车进站(栈,字典排序)
http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282 给定一个正整数N代表火车数量,0<N&l ...
- poj 1363 火车进站 (栈的应用)
Description There is a famous railway station in PopPush City. Country there is incredibly hilly. Th ...
- 火车进站输出路径(HDU1022)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 解题报告: 思路: 就是维护好这个栈,只要它不是空,并且头部和ans相同,就一直出栈,直到不满足 ...
- 火车安排问题(dp好题)
火车站内往往设有一些主干线分叉出去的铁路支路,供火车停靠,以便上下客或装载货物.铁路 支路有一定长度:火车也有一定的长度,且每列火车的长度相等. 假设某东西向的铁路上,有一小站.该站只有一条铁路支路可 ...
- HDU 1022(火车过站 栈)
题意是给定火车进站的序列和出站的序列,问能否完成转换,若能输出过程. 和另一道以火车进站为背景的栈应用题类似,但增加了对于过程的输出,只需要多记录一下进出站顺序即可. #include <bit ...
随机推荐
- php链表笔记:合并两个有序链表
<?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/2 * Time: 15:29 */ /** * 合并两个有序链 ...
- 84 落单的数 III
原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...
- https证书加密
对称加密 浏览器向服务端发送请求时,服务端首先给浏览器发送一个秘钥,浏览器用秘钥对传输的数据进行加密后发送给浏览器,浏览器拿到加密后的数据使用秘钥进行解密 非对称加密 服务端通过rsa算法生成一个公钥 ...
- vue 模版组件用法
第一种 //首先,别忘了引入vue.js <div id="user_name_01"></div> <script src="../nod ...
- 比特承诺 Bit Commitment
Introduction-A story Alice:股票经纪人 Bob:股民 Alice:你的钱交给我,我替你买股票,我专业,挣钱多! Bob:怎么证明? Alice:我们上月买进的1 ...
- Leetcode75. Sort Colors颜色分类
给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...
- php 网页内容抓取
最近抓的2个网站内容的代码 列表页抓取:第一种使用phpquery插件,可以快速获取,第二种它是api,所以直接获取 load_third("phpQuery.php"); /** ...
- js的简单介绍和相关的必备常识
一.概念 1.js是JavaScript的缩写,是运行在浏览器端或服务端的依附于页面的脚本语言. 2.js的学习分为:ECMA语法.Dom网页对象模型.Bom浏览器的对象模型 3.ECMA是浏览器厂商 ...
- 苹果系统 IOS 12 的H5 BUG :键盘把页面顶上去了,底下留有一块空白区域
苹果以往的系统是没问题的,一般情况下,点击input唤起键盘后是会自动显示到输入框的地方,然后收起键盘页面就会恢复到底部. 但是如果苹果是已经更新到最新的IOS12的话就会发生一个BUG ,就是键盘唤 ...
- 群晖的moments套件 发生未知错误
一次了,哎 也不知道什么原因引起的 只能再搞一遍 先把homes文件夹数据弄走,免得弄丢 然后卸载momemts,删除数据库 还有其他人遇到这个情况http://www.gebi1.com/threa ...