hdu 1050 Moving Tables(迷之贪心...)
题意:有400间房间按题目中图片所给的方式排列,然后给出要移动的n张桌子所要移动的范围,每张桌子要移动的范围不能出现重叠的区域;问最少要多少次才能移动完所有的桌子。
题解思路:把题目转换下,就是有n个区间,每次可以去除掉k个没有重叠部分的区间,最少要多少次能去掉所有区间。妥妥的,,贪心。可能会有人联想到经典的“区间调度问题”。但很遗憾,在这里行不通;区间调度问题是按区间右端排序后尽可能选取结束时间早的,但这种贪心只是一次性选取尽可能多的区间,而本题是要求选取完所有区间所要花费次数最少。从整体上看,如果只是每次找到尽可能多的区间,对一次的遍历从房间尾号排序确实达到了这样的目的,但整体目的却不是这样的,因为最终是要把所有的区间都找完的,并不是说仅仅找最多的一次,你还要顾及后面的让每一次都尽可能找得更多的房间。所以不管前几次怎样,你现在要找的这一次需要越靠前开始找。 因此正解应该是按区间左端排序,然后每次找最靠前的。 虽然看完上面的解释可能还是会不怎么明白为什么第一种贪心是错的,那就测试下面这组数据琢磨琢磨吧:
- Input
- Output
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <set>
- #include <utility>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stack>
- const int inf=0x3f3f3f3f;
- const double PI=acos(-1.0);
- const double EPS=1e-;
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> P;
- int T,n;
- typedef struct node
- {
- int l,r;
- } node;
- node a[];
- bool cmp(node a,node b)
- {
- return a.l<b.l;
- }
- int book[];
- int main()
- {
- //freopen("input.txt","r",stdin);
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&n);
- int l,r;
- for(int i=; i<=n; i++)
- {
- scanf("%d%d",&l,&r);
- a[i].l=(l%)?(l/+):l/;
- a[i].r=(r%)?(r/+):r/;
- if(a[i].l>a[i].r) swap(a[i].l,a[i].r);
- }
- //
- sort(a+,a++n,cmp);
- //
- memset(book,,sizeof(book));
- int ans=;
- int N=n;
- while(n)
- {
- //printf("%d\n",n);
- ans++;
- int temp=;
- while(book[temp]) temp++;
- book[temp]=;
- n--;
- for(int i=temp+; i<=N; i++)
- {
- if(!book[i]&&a[i].l>a[temp].r)
- {
- n--;
- book[i]=;
- temp=i;
- }
- }
- }
- //
- printf("%d\n",ans*);
- }
- return ;
- }
还有另一种贪心方法更直接明了:计算出所有区间中最大的重叠次数,即答案。因为假设有块地方被k个区间所重叠,那么无论如何选择,这块地方肯定都是至少要k次才能移动完重叠在这上面的区间;而其他地方肯定也都能在k次以内移动完的。 计算重叠部分的话,,这题数据略水可以暴力过去...=_=
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <set>
- #include <utility>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stack>
- const int inf=0x3f3f3f3f;
- const double PI=acos(-1.0);
- const double EPS=1e-;
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> P;
- int T,n;
- typedef struct node
- {
- int l,r;
- } node;
- node a[];
- int book[];
- int main()
- {
- //freopen("input.txt","r",stdin);
- scanf("%d",&T);
- while(T--)
- {
- memset(book,,sizeof(book));
- scanf("%d",&n);
- int l,r;
- for(int i=; i<=n; i++)
- {
- scanf("%d%d",&l,&r);
- a[i].l=(l%)?(l/+):l/;
- a[i].r=(r%)?(r/+):r/;
- //
- if(a[i].l>a[i].r) swap(a[i].l,a[i].r);
- //
- for(int j=a[i].l;j<=a[i].r;j++) book[j]++;
- }
- int Max=-inf;
- for(int i=;i<=;i++) Max=max(Max,book[i]);
- printf("%d\n",Max*);
- }
- return ;
- }
hdu 1050 Moving Tables(迷之贪心...)的更多相关文章
- POJ 1083 && HDU 1050 Moving Tables (贪心)
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- --hdu 1050 Moving Tables(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 AC code: #include<stdio.h> #include<str ...
- HDU 1050 Moving Tables (贪心)
题意:在一个走廊两边都有对称分布的连续房间,现在有n张桌子需要从a移动到b房间.每次移动需要10分钟, 但是如果两次移动中需要经过相同的走廊位置,则不能同时进行,需要分开移动.最后求最少需要多长时间移 ...
- 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 1050 Moving Tables (Greedy)
Problem - 1050 过两天要给12的讲贪心,于是就做一下水贪心练习练习. 代码如下: #include <cstdio> #include <iostream> #i ...
- 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 ...
随机推荐
- 【BZOJ4241】历史研究(回滚莫队)
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本 ...
- [转]Android监听ListView里Button事件
本文转自:http://blog.csdn.net/lovediji/article/details/6753349 public View getView(int position, View co ...
- 如何成为一名出色的Oracle数据库管理员
主要针对Oracle DBA在成长阶段的定位,学习方法等几大方面进行了经典的论述,详细内容请参考下文. 一.定位 Oracle分两大块,一块是开发,一块是管理.开发主要是写写存储过程.触发器什么的,还 ...
- JS——client
clientTop.clientLeft: clientTop:盒子的上boder clientLeft:盒子的左border clientWidth与clientHeight 1.在有DTD情况下: ...
- 第一个真正意义的jsp程序,连接msql数据库
1. mysql数据库 :在百度上下一个安装包mysql-5.7.17.msi,只装服务即可,选择开发使用 2.建库,建表 mysql> create table testdb; 导入相关建表 ...
- CaffeMFC:caffe.pb.h(2525): error C2059: syntax error : 'constant'
下边的语句会报 syntax error : 'constant'. static const DimCheckMode STRICT = V1LayerParameter_DimCheckMode_ ...
- Python 之12306网站验证码校验案例
import requests from PIL import Image import jsons requests.packages.urllib3.disable_warnings() head ...
- vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面
3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...
- Scrapy实战:使用scrapy再再次爬取干货集中营的妹子图片
需要学习的知识: 1.获取到的json数据如何处理 2.保存到json文件 3.保存到MongoDB数据库 4.下载项目图片(含缩略图) 1.创建项目 scrapy startproject gank ...
- python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的
快 快了 啊 嘿 小老弟 想啥呢 今天这篇爬虫教程的主题就是一个字 快 想要做到秒爬 就需要知道 什么是多进程 什么是多线程 什么是协程(微线程) 你先去沏杯茶 坐下来 小帅b这就好好给你说道说道 关 ...