有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。
现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。
可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
标签:线段 区间 整数 enter stream 时间 namespace 外部 error:
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。
现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。
可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
4 2
1 2
0 2
11 2
1 5
4 7
0 0
2
5
PS:我忍不住吐槽一下,这道题暴力法解决!不需要想问题想的太复杂了!想那么多干什么?这道题的时间复杂度最高是O(10^6),不会超过1s的!
昨天晚上我做的时候,想复杂了... 还去把左右区间排了个序...根本不需要...这道题就是一个简单的模拟题,题目要你干啥,你就干啥,只是把中文话,变成代码,让计算机懂!
那么问题来了?"区间之间可能有重叠 "
这句话怎么翻译?设置一个访问数组visit[]就行,初始化全为0,当访问过了就置为-1.一旦没访问过,就L--;
输出需要注意的是:L+1 因为是剩下的树的数量
//碰到的一个报错:
error: reference to ‘left‘ is ambiguous
自定义的left 变量与库中重名;
解决:修改一下变量名
代码如下:
1 #include <iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<cstring> 5 #define maxn 10001 6 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 7 using namespace std; 8 9 int L,M;//长度以及组数 10 typedef struct interval{ 11 int l;//左端点, 12 int r;//右端点 13 }Interval; 14 int visit[maxn]; 15 16 Interval inter[maxn]; 17 void solve(){ 18 int i,j; 19 for(i=0;i<M;i++){ 20 for(j=inter[i].l;j<=inter[i].r;j++){ 21 if(visit[j]==0) { 22 L--; 23 visit[j]=-1; 24 } 25 } 26 } 27 cout<<L+1<<endl; 28 29 } 30 int main(int argc, char** argv) { 31 32 int i; 33 34 cin>>L>>M; 35 while(L&&M){ 36 memset(visit,0,sizeof(visit)); 37 for(i=0;i<M;i++){ 38 cin>>inter[i].l>>inter[i].r; 39 } 40 41 solve(); 42 cin>>L>>M; 43 } 44 return 0; 45 }
标签:线段 区间 整数 enter stream 时间 namespace 外部 error:
原文地址:https://www.cnblogs.com/industrial-fd-2019/p/10599403.html