HDU 1050(搬椅子 数学)
题意是在一个有 400 个房间的走廊中搬动房间里的椅子,如果两次的路线重叠,就要分两次搬动,如果不重叠,就可以一次搬动。
开始的时候直接当成求线段重叠条数的题,发现这种思路完全是错的,比如 1 - 3,2 - 4,3 - 5 这一组,只需搬动两次即可,但找重叠线段的话就会找到 3 条重叠线段。
然后打算直接模拟做,加入一点贪心的思路,用结构体数组存搬动要求,按椅子搬动的距离从小到大排序,扫描一边整个结构体数组,将搬动的路径标记,
若已经标记过,则 ++ans,注意 ans 的初值为 1,因为第一次搬动要算作一次搬动,但这一次没有与任何路径重叠。
模拟做的直接超时了......
代码如下:
int t,n,ans,mp[];
bool f;
struct node
{
int from,to,len;
}p[];
bool cmp(node a,node b)
{
return a.len!=b.len?a.len<b.len:a.from<b.from;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ans = ;
memset(mp,,sizeof(mp));
for(int i = ; i < n; ++i)
{
scanf("%d%d",&p[i].from,&p[i].to);
p[i].len = p[i].to-p[i].from;
}
sort(p,p+n,cmp);
for(int i = ; i < n; ++i)
{
f = true;
for(int j = p[i].from; j <= p[i].to; ++j)
{
if(mp[j])
{
ans++;
fill(mp+p[i].from,mp+p[i].to,-);
f = false;
break;
}
}
if(f) fill(mp+p[i].from,mp+p[i].to,-);
}
printf("%d\n",ans*);
}
return ;
}
看了其他人的做法,才知道不应该把房间看作排列在一条线段上的点,而是如题目中描述的那样排在一对平行线上:

这样将房间前的位置用一个长 200 的一维数组来存,在每次的路径的每一个位置上增加 1,这个数组中的最大值即为搬动次数。如图示的情况即为:1,2,2,0,...

搬动次数即为 2 次。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,n,from,to,ans;
int cnt[],tmp;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(cnt,,sizeof(cnt));
ans = ;
for(int i = ; i <= n; ++i)
{
scanf("%d%d",&from,&to);
if(from > to)
{
tmp = from;
from = to;
to = tmp;
}
for(int j = (from+)/; j <= (to+)/; ++j)
cnt[j]++;
}
for(int i = ; i <= ; ++i)
if(ans<cnt[i]) ans = cnt[i];
printf("%d\n",ans*);
}
return ;
}
另外还知道了一点,在交换两变量的值时,用位运算的方法更快:
如 temp = a; a = b; b = temp;
用位运算实现:a = a^b; b = a^b; a = a^b;
本题中由于没注意到有可能搬动是从房间号较大的房间搬向房间号较小的房间,还 wa 了......
解决办法就是再加一步如果是这种情况就交换两房间的号码,即还是从小到大的顺序,这里直接交换的结果是 15ms,用位运算交换的结果是 0ms.
以后就要改用这种位运算交换的方法了。
特向这篇博客的作者致谢:https://www.cnblogs.com/cchun/archive/2011/05/14/2520076.html
HDU 1050(搬椅子 数学)的更多相关文章
- hdu 1421:搬寝室(动态规划 DP + 排序)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1050(楼道搬桌子问题)(不是贪心解法,思路很新颖)
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- --hdu 1050 Moving Tables(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 AC code: #include<stdio.h> #include<str ...
- hdu 1050 Moving Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 这道题目隔了很久才做出来的.一开始把判断走廊有重叠的算法都想错了.以为重叠只要满足,下一次mov ...
- hdu 1050 Moving Tables
http://acm.hdu.edu.cn/showproblem.php?pid=1050 这个题我首先直接用的常规贪心,用的和那个尽可能看更多完整节目那种思路.但是.......一直WA....T ...
- HDU – 1050 Moving Tables
http://acm.hdu.edu.cn/showproblem.php?pid=1050 当时这道题被放在了贪心专题,我又刚刚做了今年暑假不AC所以一开始就在想这肯定是个变过型的复杂贪心,但是后来 ...
- HDU 5650 so easy 数学
so easy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5650 Description Given an array with n integ ...
- 题解报告:hdu 1421 搬寝室(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9 ...
- HDU 1421 搬寝室 (线性dp 贪心预处理)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
随机推荐
- 【XSY2787】Mythological VII 贪心
题目描述 有两个指针\(l,r\),初始时\(l=r=k\) 给你\(a_1,\ldots,a_n\),你要移动\(l,r\),\(l\)只能每次向左移一个数,\(r\)只能向右移一个数,要求任意时刻 ...
- bzoj 1103 : [POI2007]大都市meg (树链剖分+线段树)
Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...
- QML用Qt.labs.settings实现保存用户设置
举个简单的例子: main.cpp中设置程序信息 QGuiApplication::setApplicationName("Gallery"); QGuiApplication:: ...
- 登录Linux服务器显示IP和自定义备注
默认搭建好的Linux服务器,使用Xshell登录的窗口如下所示: 可根据需要执行如上代码,再重新登录服务器,效果如下图所示: 代码片段:echo "export PS1='\u@\[\e[ ...
- python3 文件和流
流: 打开文件: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ...
- 【转】STM32三种启动模式
@2018-12-16 [小记] STM32 启动区域 STM32三种启动模式 借助上述文章理解官方文档<一种从用户代码调用系统存储器中 Bootloader 的方法 >
- Python面试指南
1.Python基本语法 1.@staticmethod 和 @classmethod Python中有三种方法,实例方法.类方法(@classmethod).静态方法(@staticmethod). ...
- CF983A Finite or not?(数学)
题意:给出分母,分子和进制,要求判断该数是否为有限小数. Solution 表示并不知道怎么判断. 度娘:“一个分数在最简分数的情况下,如果它的分母只含有2和5两个质因数,这个分数就能化成有限小数.” ...
- 牛客练习赛28 B数据结构(线段树)
链接:https://www.nowcoder.com/acm/contest/200/B来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 用foobar进行码率转换 适用与sacd-r转成低码率
之前下载了不少高清音频,有黑胶转录的也有母带文件.这些高清音频大都是24bit,采样率96khz或者88.2khz或者更高.而我想将部分精品专辑刻录成cd.首先我需要将这些文件转换为16bit,44. ...