hdoj1050 Moving Tables(贪心)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1050
题意
有一条走廊,走廊两边各有200个房间,一边的房间编号是奇数,另一边是偶数。现在有n个箱子需要从一个房间移动到另一个房间,移动一个箱子需要10分钟,箱子可以同时移动,但某一段走廊每次只能移动1个箱子,比如(1,3)和(6,8)可以同时移动,而(1,5)和(6,8)不能同时移动,求最少需要多少时间可以把箱子移动完毕。
思路
先将箱子按开始的房间号由小到大排序,然后循环遍历,在遍历的过程中不断去除可以同时移动的箱子(表示箱子已移动完毕),记录循环的次数,直到所有的箱子均已移动完毕。循环次数*10即是答案。由于这是区间相交问题,所以要将所有的房间号映射到一维坐标系中,根据题目中的图可知,对于房间号为k的房间来说(k为偶数),房间k和房间k-1是相对的,也就是偶数k和k-1在坐标轴上对应的是同一位置,所以要将所有编号为偶数k的房间的编号转化成k-1.
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std; struct Node
{
int s, e;
bool visit; //记录箱子是否已经移动完毕,值为true则移动完毕 Node(int s, int e) :s(s), e(e), visit(false) {}
bool operator < (const Node& node)const
{
return s < node.s; //将房间按开始房间号从小到大排序
}
}; int main()
{
//freopen("hdoj1050.txt", "r", stdin);
vector<Node> v;
int m, n;
cin >> m;
while (m--)
{
cin >> n;
v.clear();
int s, e;
for (int i = ; i<n; i++)
{
cin >> s >> e;
if (s > e) //注意输入的开始房间号可能大于结束房间号
swap(s, e);
if (s % == ) //房间号为偶数的,要变成该偶数的前一个奇数
s--;
if (e % == )
e--;
v.push_back(Node(s, e));
} sort(v.begin(), v.end());
int ans = ; //记录循环的次数
int cnt = ; //记录已经移动完毕的箱子的个数
int cur = ; //当前从第cur个箱子开始遍历
int t;
while (cnt != n)
{
for (int i = ; i<n; i++)
{
if (!v[i].visit)
{
cur = i;
t = v[i].e;
v[i].visit = true;
cnt++;
break;
}
}
for (int i = cur+; i<n; i++)
{
if (!v[i].visit && v[i].s > t)
{
cnt++;
t = v[i].e;
v[i].visit = true;
}
}
ans++;
}
cout << ans * << endl;
}
return ;
}
注意点
1、要按开始房间号从小到大排序,而不是结束房间号。手动运行下面的数据有助于理解:
2、输入的开始房间号可能大于结束房间号,此时要将两者交换;
3、对于编号为偶数k的房间,需将其编号转为奇数k-1
测试数据
输入:
输出:
hdoj1050 Moving Tables(贪心)的更多相关文章
- Moving Tables(贪心或Dp POJ1083)
Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28304 Accepted: 9446 De ...
- zstu.2512. Moving Tables(贪心)
Moving Tables Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1182 Solved: 563 Description The famo ...
- HDU1050(Moving Tables:贪心算法)
解题思路: 这种做法是基于hdu2037的做法上考虑的,找出所有可以同时搬运的桌子,然后就很方便求出最短总时间. 还有一种更简单的做法是直接遍历一遍找出与别的重复次数最多的那片区域,重复次数*10就可 ...
- hdu_1050 Moving Tables 贪心
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- UVAlive 2326 Moving Tables(贪心 + 区间问题)
The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in ...
- --hdu 1050 Moving Tables(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 AC code: #include<stdio.h> #include<str ...
- POJ 1083 && HDU 1050 Moving Tables (贪心)
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdoj 1050 Moving Tables【贪心区间覆盖】
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDOJ 1050 Moving Tables
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- 【转】MYSQL数据库设计规范与原则
转载出:http://www.cnblogs.com/lovekingly/p/5044278.htmlMYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数( ...
- Grafana关键词
The open platform for beautiful analytics and monitoring. data source.panels.apps.dashboards. Organi ...
- 网络编程之python zeromq学习系列之一
简介: zeromq中间件,他是一个轻量级的消息中间件,传说是世界上最快的消息中间件,为什么这么说呢? 因为一般的消息中间件都需要启动消息服务器,但是zeromq这厮尽然没有消息服务器,他压根没有消息 ...
- 微服务深入浅出(9)-- Nginx
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,处理请求是异步非阻塞的,多个连接(万级别)可以对应一个进程.而Apache是同步多进程模型,一个连接对 ...
- Java容器Set接口
Set接口的实现,可以方便地将指定的类型以集合类型保存在一个变量中.Set是一个不包含重复元素的Collection,更确切地讲,Set 不包含满足 e1.equals(e2) 的元素对,并且最多包含 ...
- 定价(Price)
传送门 [题目描述] 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多 ...
- php 创建验证码方法
php创建验证码方法: <?php function getVerify($length=4,$sessName='verify'){ //验证码 //获取字符串 去除01ol等较难辨认字符 $ ...
- 解决多个python的兼容问题
方法1:将(安装路径和scripts)路径添加到系统环境变量,谁的顺序在前面谁就是默认的 方法2:修改python的名字,然后再终端输入比如python2或者python3
- TCP确认延时和Nagle算法
TCP确认延时和Nagle算法 nagle 算法是 发送端 收到前一个报文的确认然后再发送下一个tcp数据.这样可以避免大量的小数据. TCP_NODELAY选项控制. Delay ACK是 ...
- Python标准库笔记(10) — itertools模块
itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...