1.
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入 复制
500 3
150 300
100 200
470 471
样例输出 复制
298
提示
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
这个题我的大致思路就是每次先将区间内的有值的数字减去然后标记,然后再判断第二个区间,如果已经被标记那就不用再减了。
#include<stdio.h>
int main()
{
int L,M,a,b,s[100000],sum=0;
scanf("%d%d",&L,&M);
for(int i=0;i<L+1;i++){
s[i]=1;
}
for(int i=0;i<M;i++){
scanf("%d%d",&a,&b);
for(int j=a;j<b+1;j++){
if(s[j]!=0){
s[j]=0;
}
}
}
for(int i=0;i<L+1;i++){
if(s[i]!=0){
sum=sum+1;
}
}
printf("%d",sum);
return 0;
}
2.
利用直接插入排序算法实现线性表的排序。要求输出第k趟排序的结果。例如原来线性表为:26,12,25,4,36,15,21,第一趟直接排序排序结果为: 12,26,25,4,36,15,21,第二趟直接插入排序结果为: 12,25,26, 4,36,15,21。
输入
输入包含若干个测试用例,第一行为测试用例个数。每个测试用例占3行,第一个为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行为k(1<=k<=n-1),即要求的第k趟排序结果。
输出
对每一测试用例,用一行输出第k趟排序结果,用空格隔开。
样例输入 复制
1
5
2 4 1 9 7
3
样例输出 复制
1 2 4 9 7
#include"stdio.h"
int main()
{
int k,n,a[1000],i,j,t,m,q;
scanf("%d",&q);
for(int i=0;i<q;i++)
{ while(q--)
{scanf("%d",&n);
{
m=0;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
scanf("%d",&k);
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
m++;
break;
}
m++;
if(m==k)
break;
}
if(m==k)
break;
}
for(i=0; i<n-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}
}
}
}
这个题的话大致思路就是每次先将最前面那个数排序然后每次排序后让k++,输入n当n==k时break就好了
几天的话还学了二叉树的遍历和并查集,因为题目还在写没有完全理解,这方面的题的题解的话只好明天再一起和我自己对二叉树和并查集的理解一起写了