Codeup 墓地——1814: 剩下的树
Posted industrial-fd-2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeup 墓地——1814: 剩下的树相关的知识,希望对你有一定的参考价值。
1814: 剩下的树
时间限制: 1 Sec 内存限制: 32 MB提交: 2403 解决: 928
[提交][状态][讨论版][命题人:外部导入]
题目描述
有一个长度为整数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 }
以上是关于Codeup 墓地——1814: 剩下的树的主要内容,如果未能解决你的问题,请参考以下文章