题目描述:
给你 nn 条在数轴上的线段,每条线段的端点都是整数。线段可以相互交叉,重叠或甚至重合。每个线段的参数是左端点和右端点的坐标。
考虑坐标 11 和 mm 以及它们之间的坐标为整数的点。您的任务是打印所有没有被线段覆盖的点。一条线段会覆盖它的端点。
输入格式:
输入的第一行包含两个整数 nn 和 mm(1 \le n,m\le1≤n,m≤100)。
然后输入 nn 行,每一行包含两个整数 ll 和 rr,为线段的左右端点(1\le l\le r\le1≤l≤r≤m)(线段可以退化为一个点)。
输出案例:
2
3 4
思路:使用数组模拟每一个端点,用循环改变端点内数组的值,存在为一不存在为零
#include<cstdio>
#include<string.h>
int main()
{
int n,m,b,c,count=0,first=1;
int arr[100];
memset(arr,0,sizeof(arr));
scanf("%d%d",&n,&m);
for(int a=0;a<n;a++)
{
scanf("%d%d",&b,&c);
for(int d=b-1;d<c;d++)
{
arr[d]=1;
}
}
for(int a=0;a<m;a++)
{
if(arr[a]!=1)
{
count++;
}
}
printf("%d\n",count);
for(int a=0;a<m;a++)
{
if(!arr[a])
{
if(first) first=0;
else printf(" ");
printf("%d",a+1);
}
}
return 0;
}
其中最注意输出格式的限制,学到了对数组整体赋值的方法,使用string.h函数,再用memset函数(数组名,赋值量,sizeof(数组名));以及对于格式具体要求的格式进行的优化:前面int first=1,在后面的判断中进行if(first) first=0的后置语句,就可以将第一个不输出空格而其他全部输出空格。
但是最关键的都不是这些,本人使用的是devc++编译,我粗心地未将count赋值0,就使得我自测正确但是提交错误,希望下次能不犯同样的错误。