题意是在一个有 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. 【支付宝】"验签出错,sign值与sign_type参数指定的签名类型不一致:sign_type参数值为RSA,您实际用的签名类型可能是RSA2"

    问题定位:从描述就可以看的出来了,你现在sign_type是  RSA类型的,要改成跟你现在用的签名类型一致的类型,也就是 要改为 RSA2 PHP为例 // 新版只支持此种签名方式 商户生成签名字符 ...

  2. flask报错:werkzeug.routing.BuildError: Could not build url for endpoint 'index'. Did you mean 'single' instead?

    错误代码 参考:https://blog.csdn.net/qq_27468251/article/details/81359701 改为

  3. [国家集训队]排队 [cdq分治]

    题面 洛谷 和动态逆序对那道题没有什么区别 把一个交换换成两个删除和两个插入 #include <cstdio> #include <cstdlib> #include < ...

  4. Hdoj 2188.悼念512汶川大地震遇难同胞——选拔志愿者 题解

    Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人员,以及进行心理疏导的心理 ...

  5. Java,mysql String与date类型转换

    String 与 date类型转换 字符串转换成日期类型: SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//小写 ...

  6. Why I don't want use JPA anymore

    转自:https://dev.to/alagrede/why-i-dont-want-use-jpa-anymore-fl Great words for what is considered by ...

  7. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  8. bzoj2007 NOI2010 海拔(对偶图)

    80分(最小割)思路 先考虑如果没有题目中东南角为\(1\)那个限制的话会怎样. 那么只要让每个点的海拔都是\(0\)就行了.这样不论怎样走,最后的答案都是0. 然后再考虑那个东南角为\(1\)的限制 ...

  9. 跟我一起使用android Studio打包react-native项目的APK

    使用的是react-native的hello-world项目 第一步:创建项目 npm install -g yarn react-native-cli react-native init Aweso ...

  10. webpack中babel配置 --- runtime-transform和babel-pollfill

    webpack - babel配置 babel是一个javascript编译器,是前端开发中的一个利器.它突破了浏览器实现es标准的限制,使我们在开发中可以使用最新的javascript语法. 通过构 ...