UVa1617 Laptop (贪心)

链接:http://vjudge.net/problem/UVA-1617

分析:先把每个区间按右端点从小到大排序,再按左端点从小到大排序。

贪心策略:

   从左边开始取,首先取第一个区间的右端点,然后在第二个区间里取点时分为3种情况:

   1)条件:第二个区间的右端点和第一个区间的右端点相同。策略:此时可以将两个区间的线段调整为相邻的,其实就是将第一个区间中的线段向前挪一个位置给第二个区间中的线段腾出空间。

   2)条件:第二个区间的左端点大于第一个区间的右端点。策略:此时中间肯定有空隙,标记加1,然后把第二个区间中的线段放置在右端点处。

   3)条件:第二个区间的左端点小于等于第一个区间的右端点。策略:此时相当于第一个区间的延伸,我们希望空隙数目最小,所以贪心的紧挨着第一个区间中的线段放一个,此时线段位置为第一个区间线段位置加1(用线段的右端点表示线段位置)。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 100000 + 5;
 6
 7 struct Interval {
 8     int l, r;
 9     bool operator < (const Interval& rhs) const {
10         return r < rhs.r || (r == rhs.r && l < rhs.l);
11     }
12 } itv[maxn];
13
14 int n;
15
16 int main() {
17     int T;
18     scanf("%d", &T);
19     while (T--) {
20         scanf("%d", &n);
21         for (int i = 0; i < n; i++) scanf("%d%d", &itv[i].l, &itv[i].r);
22         sort(itv, itv + n);
23         int ans = 0;
24         int curPos = itv[0].r;
25         for (int i = 1; i < n; i++) if (curPos != itv[i].r) {
26             if (curPos < itv[i].l) { ans++; curPos = itv[i].r; }
27             else curPos++;
28         }
29         printf("%d\n", ans);
30     }
31     return 0;
32 }
时间: 2024-09-29 10:24:31

UVa1617 Laptop (贪心)的相关文章

UVA-1617 Laptop (贪心)

题目大意:有n条长度为1的线段,n个区间,第i条线段在第i个区间中,问线段之间的最少间隙有几个. 题目分析:先对区间排序,先按右端点排,再按左端点排.有重叠的区间(仅有交点重叠也视为重叠)之间一定可以摆不出空隙来.贪心策略:每碰到一个新的区间(与前面区间没有任何重叠),则把线段放到该区间最后一个长度为1的位置,如果不是新区间则可以直接忽略. 代码如下: # include<iostream> # include<cstdio> # include<cstring> #

UVa 1617 Laptop (贪心)

题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左端点排,然后再扫一遍,如果第一个区间的右端点和第二个右端点一样, 一定可以相邻,如果不相等,再看是不是与左端点大小关系,如果小于左端点,那么就一定会产生空隙,如果不是小于,就可以,那么端点要向右移动一个单位,其他的也样判断. 代码如下: #include <cstdio> #include <

【uva 1615】Highway(算法效率--贪心 区间选点问题)

题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我先空着.挖坑~

【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

[题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和牧草都按照鲜嫩度由大到小排序,对于每奶牛把鲜嫩度大于它的都扔进treap,然后找出后继. 不过注意后继的概念是大于它且最小的,然而我们这里是可以等于的,所以应该是找cow[i].fresh-1的后继,注意一下…… 1 #include<iostream> 2 #include<cstdio&

POJ1017 Packets(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 51306          Accepted: 17391 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

ZOJ 3946 Highway Project 贪心+最短路

题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946 题解: 用dijkstra跑单元最短路径,如果对于顶点v,存在一系列边(ui,v)使得dis[v]最小(dis[v]表示0到v的距离).这些边能且只能选一条,那么我们自然应该选cost最小的那个边了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc

CoderForce 140C-New Year Snowmen(贪心)

题目大意:有n个已知半径的雪球.堆一个雪人需要三个尺寸不同的雪球,问用这些雪球最多能堆多少个雪人? 题目分析:先统计一下每种尺寸的球的个数,从三种最多的种类中各取出一个堆成雪人,这样贪心能保证的到的数目最多. 代码如下: # include<iostream> # include<map> # include<vector> # include<cstdio> # include<queue> # include<algorithm>

计蒜客 跳跃游戏(贪心)

给定一个非负整数数组,假定你的初始位置为数组第一个下标.数组中的每个元素代表你在那个位置能够跳跃的最大长度. 请确认你是否能够跳跃到数组的最后一个下标. 例如: A = [2,3,1,1,4], return ture A = [3,2,1,0,4], return false. 格式: 第一行输入一个正整数n,接下来的一行,输入数组A[n].如果能跳到最后一个下标,输出"true",否则输出"false" 样例1 ????输入:???? ????????5 ???

BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心

题意: n个点,一棵树,有些点是关键点,可以将m个点染色. 求所有关键点到最近的被染色点的距离的最大值最小. 解析: 反正从这道题我是学了一种做题思路? 大爷讲课的时候说的:一般选择某些点的代价相同的话都是贪心,代价不同的话一般都是DP. 想想也挺对的,不过就是没有感悟到过? 反正这题考试的时候我是直接D了贪心的- -! 忘了为啥D了. 显然最大值最小我们需要二分一下这个值. 然后接下来我们从下往上扫整棵树. 节点的状态有几个? 第一种是 子树内没有不被覆盖的关键点,并且子树中有一个节点的贡献可