4
1一直不对 ∵ 后续更改
int L,M,i;
scanf("%d %d",&L,&M);
int a[200];
for(i=0;i<M;i++)
scanf("%d %d",&a[2i],&a[2i+1]);
int max=0,min=a[0],reputition=0,blank=0;//reputition要减去的重复部分
for(i=0;i<M;i++) //blank不在区域内的
{
if(a[i2]>max)
max=a[i2];
if(a[i2]<min)
min=a[2i];
if(a[2i]>a[2i+1])
reputition+=a[2i]-a[2i+1]+1;
if(a[2i+1]-a[i2]>1)
blank+=a[i2+1]-a[i2]-1;
}
printf("%d",(L+1)-(max-min+1)-reputition+blank);
return 0;
◮◮◮◮:用 a[2i] 和 a[2i + 1] 存储,每次读入 1 个区域的 2 个整数


每次读入 1 个区域的 2 个整数 ,用for(i=0;i<M;i++)
{ if(a[2i]>a[2i+1])
reputition+=a[2i]-a[2i+1]+1;这样就只会出现1 2,3 4,5 6 ,7 8,...这样的配对,不会有1,2 3,4 5,...这样 (repetition 打错了)
第二种思路
bug:怎么合并重叠区间
相邻的区域也有重叠的!!
#include<stdio.h>
#include<stdlib.h>
//比较函数
int compare(const void *a,const void *b)
{
int x=(int)a;int y=(int)b;
return x[0]-y[0];
}
int main()
{
int L,M;
scanf("%d %d",&L,&M);
int arr[M][2],i;
for(i=0;i<M;i++)
scanf("%d %d",&arr[i][0],&arr[i][1]);
qsort(arr,M,sizeof(arr[0]),compare);//arr[0] 是列,代表int[2] arr[i][0] arr[i][1]
int arr2[M][2],count=0;//存放合并后的区间,及区间数量
arr2[count][0]=arr[0][0];arr2[count][1]=arr[0][1];
count++;
for(i=1;i<M;i++)
{
int start_1=arr2[count-1][0];
int end_1=arr2[count-1][1];
int start_2=arr[i][0];
int end_2=arr[i][1];
if(start_2<=end_1)
arr2[count-1][1]=(end_1>end_2?end_1:end_2);
else
{
arr2[count][0]=start_2;
arr2[count][1]=end_2;
count++;
}
}
int removed = 0;
for (int i = 0; i < count; i++)
removed += arr2[i][1] - arr2[i][0] + 1;
// 总树木数 - 移除数 = 剩余数
int total = L + 1;
int remaining = total - removed;
printf("%d\n", remaining);
return 0;
还洗不懂┭┮﹏┭┮
浙公网安备 33010602011771号