今天天梯赛,考的很烂....
今天在牛客就写了一道模拟水题
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
但是还是有一些小小心得
上代码:
#include <bits/stdc++.h>
using namespace std;
const int mxn=1e2+10;
struct ty{
int x,y;
}p[mxn];
bool comp(ty a,ty b){
if(a.x<b.x) return 1;
else return 0;
}
int main(){
int L,q,cnt;
scanf("%d %d",&L,&q);
cnt=L+1;
for(int i=1;i<=q;i++){
scanf("%d %d",&p[i].x,&p[i].y);
}
sort(p+1,p+1+q,comp);
int l=p[1].x,r=p[1].y;
for(int i=2;i<=q;i++){
if(r>=p[i].x){
r=max(p[i].y,r);
}else{
cnt-=r-l+1;
l=p[i].x;
r=p[i].y;
}
}
cnt-=(r-l+1);
printf("%d\n",cnt);
return 0;
}
/*主要思路是把这么多区间按结构体排序(今天天梯赛我连这个都写不出来....)
然后合并的过程中更新l和r的值,维护好cnt的值就行了*/
/*关于如何写代码:
1.区间肯定是用一个结构体保存的
2.合并的过程一定是个循环,合并的次数固定,因此肯定使用for循环
3.然后我们在循环的过程中一定是想要维护一些东西,然后将他们保存到数组中或者直接输出
在本题中我们需要更新左右端点的值,因为这个端点的值可以维护cnt
4.在for循环中一般需要分类讨论我们的情况,这个时候按样例模拟即可
小结(一些在模拟过程中的要点):模拟题意过程中最好把样例模拟一遍,然后用for-if循环嵌套
然后写循环之前我们需要搞清楚题目要求的是什么,即我们需要维护的是什么
用数组或更复杂的数据结构去保存我们需要维护的东西
然后输出即可*/