话不多说,看代码:
#include <stdio.h>
#include <stdlib.h>
int a[105];
int x[105];
int c[105];
int max(int x,int y)
{
return x>y?x:y; //防止有多种相同约束条件出现,以便选取合适的区间
}
int min(int x,int y)
{
return x<y?x:y; //同上
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int k=0;
int sx=0,fx=0; //分别代表最小区间和最大区间
for(int i=0; i<n; i++)
{
scanf("%d %d",&a[i],&x[i]);
if(a[i]==1)
{
sx=max(x[i],sx);
}
if(a[i]==2)
{
fx=min(x[i],fx);
}
if(a[i]==3)
{
c[k++]=x[i];
}
}
int count=fx-sx+1; //计算在这个区间符合条件的总数
for(int i=0;i<k;i++)
{
if(c[i]>=sx&&c[i]<=fx)
{
count--;
}
}
if(count<0)
{
count=0;
}
printf("%d\n",count);
}
return 0;
}
整个思路:
首先,定义三个数组a、x和c,分别用于存储输入的整数类型、整数位置和类型为3的整数位置。然后定义两个函数max和min,用于计算两个整数的最大值和最小值。
在main函数中,首先读取测试用例的数量t,然后对每个测试用例进行处理。对于每个测试用例,首先读取整数的数量n,然后初始化变量sx和fx,分别表示类型为1和2的整数的最大位置和最小位置。
接下来,通过循环读取每个整数的类型和位置,并根据类型更新sx、fx和c数组。如果整数类型为1,则更新sx为当前位置和sx的最大值;如果整数类型为2,则更新fx为当前位置和fx的最小值;如果整数类型为3,则将当前位置添加到c数组中。
然后计算count,表示类型为1和2的整数之间的整数数量。接着遍历c数组,如果某个位置在sx和fx之间,则将count减1。最后,如果count小于0,则将其置为0。
最后,输出count的值,即未被覆盖的整数数量。