鱼C论坛

 找回密码
 立即注册
查看: 981|回复: 9

[已解决]区间覆盖问题

[复制链接]
发表于 2022-2-22 15:26:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
屏幕截图 2022-02-22 152517.png

没啥思路,题目也是半懂,求大佬指点
最佳答案
2022-2-22 21:35:59
本帖最后由 jhq999 于 2022-2-22 21:40 编辑
傻眼貓咪 发表于 2022-2-22 18:23
我只读懂题目,但没有思路。

以题目为例:


根据你提供的题意
  1. #include <stdlib.h>
  2. int aggregate(int (*areg)[2],int count)
  3. {
  4.         int i=0,j=0,sum=count;
  5.         for (int i = 0; i < count; i++)
  6.         {
  7.                 for (int j = 0; j < count; j++)
  8.                 {
  9.                         if (i!=j)
  10.                         {
  11.                                 if((areg[i][0]>=areg[j][0])&&(areg[i][1]<=areg[j][1]))sum--;//只要其中一个是另一个子集数目就减1,当然也可以像排序一样优化复杂度,我就提供个思路
  12.                         }
  13.                 }
  14.         }
  15.         return sum;
  16. }
  17. int main()
  18. {
  19.         int num=0,count=0;
  20.         scanf("%d",&num);

  21.         int i=0,j=0,*result=(int*)malloc(4*num) ;
  22.         for(i=0;i<num;i++)
  23.         {
  24.                 scanf("%d",&count);
  25.                 int (*data)[2]=(int(*)[2])malloc(4*count*2);
  26.                 for(j=0;j<count;j++)
  27.                 {
  28.                         scanf("%d%d",&data[j][0],&data[j][1]);
  29.                 }
  30.                 result[i]=aggregate(data,count);
  31.                 free(data);
  32.         }

  33.         for(i=0;i<num;i++)printf("%d\n",result[i]);
  34.         free(result);
  35.         return 0;
  36. }
复制代码
  1. 2
  2. 3
  3. 1 1
  4. 2 2
  5. 3 3
  6. 3
  7. 1 1
  8. 1 3
  9. 3 3
  10. 3
  11. 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-22 18:23:55 | 显示全部楼层
我只读懂题目,但没有思路。

以题目为例:
输入若干区间,这里我把它们命名为子区间。
从子区间中选取并以最少子区间(当然可以重叠),满足 [1, N] 所有数字区间,比如题目:

样例 1:
3
1 1
2 2
3 3

[1, N] 表示 1 至 N = 1, 2, 3(子区间必须覆盖这三个数字)
目前有 3 个子区间,分别是 [1, 1](只有覆盖数字 1),[2, 2](只有覆盖数字 2),[3, 3](只有覆盖数字 3)
所以 3 个字区间都要,才能确保全部数字被覆盖。
答案:3

// -------------------------------------------------------------------------------------------------------

样例 2:
3
1 1
1 3
3 3

[1, N] 表示 1 至 N = 1, 2, 3(子区间必须覆盖这三个数字)
目前有 3 个子区间,分别是 [1, 1](只有覆盖数字 1),[1, 3](此区间覆盖 1, 2, 3),[3, 3](只有覆盖数字 3)
以最少子区间能覆盖所有数字就只需一个便可(就是 [1, 3])
答案:1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-22 20:09:32 | 显示全部楼层
傻眼貓咪 发表于 2022-2-22 18:23
我只读懂题目,但没有思路。

以题目为例:

搜嘎,还是要感谢大佬的分析
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-22 21:35:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-2-22 21:40 编辑
傻眼貓咪 发表于 2022-2-22 18:23
我只读懂题目,但没有思路。

以题目为例:


根据你提供的题意
  1. #include <stdlib.h>
  2. int aggregate(int (*areg)[2],int count)
  3. {
  4.         int i=0,j=0,sum=count;
  5.         for (int i = 0; i < count; i++)
  6.         {
  7.                 for (int j = 0; j < count; j++)
  8.                 {
  9.                         if (i!=j)
  10.                         {
  11.                                 if((areg[i][0]>=areg[j][0])&&(areg[i][1]<=areg[j][1]))sum--;//只要其中一个是另一个子集数目就减1,当然也可以像排序一样优化复杂度,我就提供个思路
  12.                         }
  13.                 }
  14.         }
  15.         return sum;
  16. }
  17. int main()
  18. {
  19.         int num=0,count=0;
  20.         scanf("%d",&num);

  21.         int i=0,j=0,*result=(int*)malloc(4*num) ;
  22.         for(i=0;i<num;i++)
  23.         {
  24.                 scanf("%d",&count);
  25.                 int (*data)[2]=(int(*)[2])malloc(4*count*2);
  26.                 for(j=0;j<count;j++)
  27.                 {
  28.                         scanf("%d%d",&data[j][0],&data[j][1]);
  29.                 }
  30.                 result[i]=aggregate(data,count);
  31.                 free(data);
  32.         }

  33.         for(i=0;i<num;i++)printf("%d\n",result[i]);
  34.         free(result);
  35.         return 0;
  36. }
复制代码
  1. 2
  2. 3
  3. 1 1
  4. 2 2
  5. 3 3
  6. 3
  7. 1 1
  8. 1 3
  9. 3 3
  10. 3
  11. 1
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
傻眼貓咪 + 1 + 1 ^.^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-22 21:50:05 | 显示全部楼层
jhq999 发表于 2022-2-22 21:35
根据你提供的题意

好厉害啊,我完全没有想到这点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-22 22:08:45 | 显示全部楼层
jhq999 发表于 2022-2-22 21:35
根据你提供的题意

这个做法超出我认识了,不过还是感谢大佬解答。会好好看的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-22 22:22:28 | 显示全部楼层
a327904410 发表于 2022-2-22 22:08
这个做法超出我认识了,不过还是感谢大佬解答。会好好看的

帮你简化 4楼 大佬的代码吧:希望对你有帮助
  1. #include <stdio.h>

  2. typedef struct{
  3.     int x, y;
  4. }Pair;

  5. int overlapping(Pair *arr, size_t N){
  6.     int sum = (int)N;
  7.     for(int i = 0; i < N; i++)
  8.     for(int j = 0; j < N; j++)
  9.     if(i != j)
  10.     if((arr[i].x >= arr[j].x) && (arr[i].y <= arr[j].y)) sum--;
  11.     return sum;
  12. }

  13. int main()
  14. {
  15.     unsigned T, N;
  16.     scanf("%u", &T);
  17.     int results[T];
  18.     for(int t = 0; t < T; t++){
  19.         scanf("%u", &N);
  20.         Pair data[N];
  21.         for(int n = 0; n < N; n++) scanf("%d%d", &data[n].x, &data[n].y);
  22.         results[t] = overlapping(data, N);
  23.     }
  24.     for(size_t i = 0; i < T; i++) printf("%d\n", results[i]);
  25.     return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-22 22:24:27 | 显示全部楼层
jhq999 发表于 2022-2-22 21:35
根据你提供的题意

大佬,问下这段代码是什么意思?后面怎么变成了二维数组
  1. int(*data)[2] = (int(*)[2])malloc(4 * count * 2);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-24 22:55:14 | 显示全部楼层
傻眼貓咪 发表于 2022-2-22 22:22
帮你简化 4楼 大佬的代码吧:希望对你有帮助

3Q
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-24 22:59:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表