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 ...
随机推荐
- 【XSY2773】基因 后缀平衡树 树套树
题目描述 有一棵树,每条边上面都有一个字母.每个点还有一个特征值\(a_i\). 定义一个节点\(i\)对应的字符串为从这个点到根的路径上所有边按顺序拼接而成的字符串\(s_i\). 有\(m\)次操 ...
- 【XSY2716】营养餐 博弈论
题目描述 给你一棵有根树,每个点有两个属性\(a,b\) 两人轮流操作,每次要减小一个点的\(a\)值,要求 \[ a_x\geq\sum_{i\in child(x)}a_ib_i \] 保证初始状 ...
- MT【278】二次齐次化
对于$c>0$,当非零实数$a,b$满足$4a^2-2ab+4b^2-c=0,$且使$|2a+b|$最大时,$\dfrac{3}{a}-\dfrac{4}{b}+\dfrac{5}{c}$的最小 ...
- [luogu1337][bzoj3680][JSOI2004]平衡点 / 吊打XXX【模拟退火】
题目描述 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有 ...
- debian源
修改debian9 stretch源 修改配置文件/etc/apt/sources.list 修改成163源: deb http://mirrors.163.com/debian/ stretch m ...
- yii2 阿里云短信 aliyun-dysms
aliyun-dysms安装 composer require "saviorlv/yii2-dysms:dev-master" 或者添加下列代码在composer.json文件中 ...
- Navicat Premium 12 破解(MySQL、MariaDB、MongoDB、SQL Server、SQLite)
打开注入到安装目录中的exe中 破解提示(还没好,继续看下去) 如果你安装的是中文版,选一下中文版(英文默认即可),获取一下key(名字和组织可以自定义) 打开Navicat,选择注册(第一次打开选注 ...
- TCP的三次握手和四次挥手图解
1. TCP建立连接的三次握手 (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确 ...
- Django 路由
创建好项目后在项目文件下的urls.py为设置路由 Django 有两种路由方式一种的精确路由 另一个为模糊路由 """mysite URL Configuration ...
- [NOIP2018]旅行(数据加强版)(图论+基环树)
数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和 ...