题意是在一个有 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(搬椅子 数学)的更多相关文章

  1. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. HDU 1050(楼道搬桌子问题)(不是贪心解法,思路很新颖)

    Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. --hdu 1050 Moving Tables(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 AC code: #include<stdio.h> #include<str ...

  4. hdu 1050 Moving Tables 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 这道题目隔了很久才做出来的.一开始把判断走廊有重叠的算法都想错了.以为重叠只要满足,下一次mov ...

  5. hdu 1050 Moving Tables

    http://acm.hdu.edu.cn/showproblem.php?pid=1050 这个题我首先直接用的常规贪心,用的和那个尽可能看更多完整节目那种思路.但是.......一直WA....T ...

  6. HDU – 1050 Moving Tables

    http://acm.hdu.edu.cn/showproblem.php?pid=1050 当时这道题被放在了贪心专题,我又刚刚做了今年暑假不AC所以一开始就在想这肯定是个变过型的复杂贪心,但是后来 ...

  7. HDU 5650 so easy 数学

    so easy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5650 Description Given an array with n integ ...

  8. 题解报告:hdu 1421 搬寝室(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9 ...

  9. HDU 1421 搬寝室 (线性dp 贪心预处理)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. 【BZOJ4042】【CERC2014】parades 状压DP

    题目大意 给你一棵\(n\)个点的树和\(m\)条路径要求你找出最多的路径,使得这些路径不共边.特别的,每个点的度数\(\leq 10\). \(n\leq 1000,m\leq \frac{n(n- ...

  2. bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)

    Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...

  3. hdu 5510 Bazinga (KMP+暴力标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 思路: 一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就 ...

  4. Hdoj 2044.一只小蜜蜂... 题解

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...

  5. Mysql 系统表

    Information_schema: 1. tables 提供表信息: 表所属数据库,表名,表类型,行数,最大自增数等等.

  6. hdu 2594 Simpsons’ Hidden Talents(扩展kmp)

    Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’ ...

  7. Arch更新时failed to prepare transaction

    error: failed to prepare transaction (could not satisfy dependencies) :: ffmpeg2.8: installing x265 ...

  8. A1136. Delayed Palindrome

    Consider a positive integer N written in standard notation with k+1 digits a​i​​ as a​k​​⋯a​1​​a​0​​ ...

  9. 第三十六节,目标检测之yolo源码解析

    在一个月前,我就已经介绍了yolo目标检测的原理,后来也把tensorflow实现代码仔细看了一遍.但是由于这个暑假事情比较大,就一直搁浅了下来,趁今天有时间,就把源码解析一下.关于yolo目标检测的 ...

  10. Salt初识和安装

    Salt Salt是一个配置管理系统,能够根据定义的状态,配置远程节点,比如保证远程节点上指定的安装包安装,运行指定的服务.Salt也是一个分布式远程执行系统,用于在远程节点上执行命令和请求数据,不论 ...