您的位置:首页 > 其它

清华大学 2011年研究生复试上机题 解题报告

2013-02-15 22:57 337 查看
题目13:剩下的树

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1641

解决:606

题目描述:

有一个长度为整数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组整数,每组有一对数字。

输出:

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入:
500 3
100 200
150 300
470 471


样例输出:
298

之前想用暴力解决,但是没有解决,总是WA,和研友们讨论,估计是超时了,求大家帮我看看!

#include <stdio.h>
//先对左端点排序,就容易了
int tree[10010] = {0};//最多有10001棵树
int main(){
int l,m;
//freopen("THU_2011_剩下的树.txt","r",stdin);
while(scanf("%d%d",&l,&m)!= EOF){
int cnt = 0;//标记留下的树的棵数
while(m--){
int s,e;//start,end
scanf("%d%d",&s,&e);
if(s < e){
for(int i = s;i <= e; i++)
tree[i] = 1;//标记将该树移走
}
else{
for(int i = e;i <= s; i++)
tree[i] = 1;//标记将该树移走
}
}
for(int i = 0; i <= l; i++){
if(tree[i] == 0)cnt++;
}
printf("%d\n",cnt);
}
//fclose(stdin);
//while(1);
return 0;
}


就写了另外一个,memset(数组的首地址,数组欲初始化的值,数组预分配的内存),比起for循环节省了很多时间

注意:它们在C、C++中都需要头文件,我因为这调了好一会,

C中 #include<string.h>

C++中#include<cstring>

已经AC的代码:

#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
int l,m;
freopen("THU_2011_剩下的树.txt","r",stdin);
while(scanf("%d%d",&l,&m)!= EOF){
int tree[10010] = {0};//最多有10001棵树
int cnt = 0;//标记留下的树的棵数
int s,e;
for(int i = 0;i < m;i++){
scanf("%d%d",&s,&e);
if(s > e){
int tmp = s;
s = e;
e = tmp;
}
memset(tree + s,1,(e - s + 1)*sizeof(int));//很节省时间
}
for(int i = 0; i <= l; i++){
if(tree[i] == 0)cnt++;
}
printf("%d\n",cnt);
}
fclose(stdin);
while(1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: