hrbust-1909理工门外的树,不用线段数,贪心思路~~
2016-03-29 13:36
302 查看
理工门外的树 | ||||||
| ||||||
Description | ||||||
哈尔滨修地铁了~理工门口外长度为N的马路上有一排树,已知两棵树之间的距离都是1m。现在把马路看成是一个数轴,马路的一端在数轴0的位置,另一端在N的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。 | ||||||
Input | ||||||
输入的第一行有两个整数N(1 <= N <= 1,000,000)和M(1 <= M <= 10,000),N代表马路的长度,M代表区域的数目,N和M之间用一个空格隔开。接下来的M行每行包含两个不同整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 | ||||||
Output | ||||||
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。 | ||||||
Sample Input | ||||||
500 3 150 300 100 200 470 471 | ||||||
Sample Output | ||||||
298 |
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=10500; struct node { int x,y; } a ; int cmp(node a,node b) { if(a.x!=b.x) return a.x<b.x;//按左端点(也可以是右端点)排序,,比较下一个区间左端点与右端点最大值的情况; else return a.y<b.y; } int main() { int n,m,i,sum; while(~scanf("%d%d",&n,&m))//题目没有说多组,不过应该是默认的; { sum=0; for(i=0; i<m; i++) { scanf("%d%d",&a[i].x,&a[i].y); if(a[i].x>a[i].y)//这里是一个坑点,题目并没有指明大小,博主也栽在这里; swap(a[i].x,a[i].y); } sort(a,a+m,cmp); sum+=a[0].x; int r=0; for(i=1; i<m; i++) { r=max(r,a[i-1].y);这里为什么要这样请看下面的样例; if(a[i].x>r) { sum+=a[i].x-r-1;//没有覆盖,加上中间的树; } } r=max(r,a[m-1].y); sum+=n-r; printf("%d\n",sum); } return 0; }
看样例:
(1)10 3
1 2
5 6
4 7
应该输出 5
相关文章推荐
- 新公司布线到接外网和H3C MSR2600路由器配置经过纪录
- ios文件管理
- ios文件读取
- arm-linux-gcc的配置
- autowire异常的三个情况
- SQL语句查询结果额外加入一列序号自己主动添加
- 原生js 学习之array 数组
- rtmp和声学回声消除调研
- 运维标准化工作流程
- 如何判断主机是大端还是小端(字节序)
- PyQt5应用与实践
- 在OSX下使用命令行修改IP与网关
- swift中的willSet与didSet
- win10安装配置vs community 2015+opencv3.1.0
- 我的第一个hibernate例子
- windows下MSVC兼容的dirent.h
- Angular JS
- Android 开发规范1.0
- jQuery插件tablesorter 表格排序 自定义排序addParser()
- day12 面试题:JSP中的四个域对象