区间覆盖问题
没啥思路,题目也是半懂,求大佬指点{:10_245:} 我只读懂题目,但没有思路。
以题目为例:
输入若干区间,这里我把它们命名为子区间。
从子区间中选取并以最少子区间(当然可以重叠),满足 所有数字区间,比如题目:
样例 1:
3
1 1
2 2
3 3
表示 1 至 N = 1, 2, 3(子区间必须覆盖这三个数字)
目前有 3 个子区间,分别是 (只有覆盖数字 1),(只有覆盖数字 2),(只有覆盖数字 3)
所以 3 个字区间都要,才能确保全部数字被覆盖。
答案:3
// -------------------------------------------------------------------------------------------------------
样例 2:
3
1 1
1 3
3 3
表示 1 至 N = 1, 2, 3(子区间必须覆盖这三个数字)
目前有 3 个子区间,分别是 (只有覆盖数字 1),(此区间覆盖 1, 2, 3),(只有覆盖数字 3)
以最少子区间能覆盖所有数字就只需一个便可(就是 )
答案:1 傻眼貓咪 发表于 2022-2-22 18:23
我只读懂题目,但没有思路。
以题目为例:
搜嘎,还是要感谢大佬的分析 本帖最后由 jhq999 于 2022-2-22 21:40 编辑
傻眼貓咪 发表于 2022-2-22 18:23
我只读懂题目,但没有思路。
以题目为例:
根据你提供的题意
#include <stdlib.h>
int aggregate(int (*areg),int count)
{
int i=0,j=0,sum=count;
for (int i = 0; i < count; i++)
{
for (int j = 0; j < count; j++)
{
if (i!=j)
{
if((areg>=areg)&&(areg<=areg))sum--;//只要其中一个是另一个子集数目就减1,当然也可以像排序一样优化复杂度,我就提供个思路
}
}
}
return sum;
}
int main()
{
int num=0,count=0;
scanf("%d",&num);
int i=0,j=0,*result=(int*)malloc(4*num) ;
for(i=0;i<num;i++)
{
scanf("%d",&count);
int (*data)=(int(*))malloc(4*count*2);
for(j=0;j<count;j++)
{
scanf("%d%d",&data,&data);
}
result=aggregate(data,count);
free(data);
}
for(i=0;i<num;i++)printf("%d\n",result);
free(result);
return 0;
}
2
3
1 1
2 2
3 3
3
1 1
1 3
3 3
3
1 jhq999 发表于 2022-2-22 21:35
根据你提供的题意
好厉害啊,我完全没有想到这点{:10_282:}{:10_257:} jhq999 发表于 2022-2-22 21:35
根据你提供的题意
这个做法超出我认识了,不过还是感谢大佬解答。会好好看的{:10_256:} a327904410 发表于 2022-2-22 22:08
这个做法超出我认识了,不过还是感谢大佬解答。会好好看的
帮你简化 4楼 大佬的代码吧:希望对你有帮助#include <stdio.h>
typedef struct{
int x, y;
}Pair;
int overlapping(Pair *arr, size_t N){
int sum = (int)N;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(i != j)
if((arr.x >= arr.x) && (arr.y <= arr.y)) sum--;
return sum;
}
int main()
{
unsigned T, N;
scanf("%u", &T);
int results;
for(int t = 0; t < T; t++){
scanf("%u", &N);
Pair data;
for(int n = 0; n < N; n++) scanf("%d%d", &data.x, &data.y);
results = overlapping(data, N);
}
for(size_t i = 0; i < T; i++) printf("%d\n", results);
return 0;
} jhq999 发表于 2022-2-22 21:35
根据你提供的题意
大佬,问下这段代码是什么意思?后面怎么变成了二维数组
int(*data) = (int(*))malloc(4 * count * 2); 傻眼貓咪 发表于 2022-2-22 22:22
帮你简化 4楼 大佬的代码吧:希望对你有帮助
3Q{:10_256:} a327904410 发表于 2022-2-24 22:55
3Q
不客气{:10_254:}
页:
[1]