鱼C论坛

 找回密码
 立即注册
查看: 837|回复: 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
我只读懂题目,但没有思路。

以题目为例:


根据你提供的题意
#include <stdlib.h>
int aggregate(int (*areg)[2],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[i][0]>=areg[j][0])&&(areg[i][1]<=areg[j][1]))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)[2]=(int(*)[2])malloc(4*count*2);
                for(j=0;j<count;j++)
                {
                        scanf("%d%d",&data[j][0],&data[j][1]);
                }
                result[i]=aggregate(data,count);
                free(data);
        }

        for(i=0;i<num;i++)printf("%d\n",result[i]);
        free(result);
        return 0;
}
2
3
1 1
2 2
3 3
3
1 1
1 3
3 3
3
1
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

以题目为例:

搜嘎,还是要感谢大佬的分析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

以题目为例:


根据你提供的题意
#include <stdlib.h>
int aggregate(int (*areg)[2],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[i][0]>=areg[j][0])&&(areg[i][1]<=areg[j][1]))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)[2]=(int(*)[2])malloc(4*count*2);
                for(j=0;j<count;j++)
                {
                        scanf("%d%d",&data[j][0],&data[j][1]);
                }
                result[i]=aggregate(data,count);
                free(data);
        }

        for(i=0;i<num;i++)printf("%d\n",result[i]);
        free(result);
        return 0;
}
2
3
1 1
2 2
3 3
3
1 1
1 3
3 3
3
1

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

好厉害啊,我完全没有想到这点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个做法超出我认识了,不过还是感谢大佬解答。会好好看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-22 22:22:28 | 显示全部楼层
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[i].x >= arr[j].x) && (arr[i].y <= arr[j].y)) sum--;
    return sum;
}

int main()
{
    unsigned T, N;
    scanf("%u", &T);
    int results[T];
    for(int t = 0; t < T; t++){
        scanf("%u", &N);
        Pair data[N];
        for(int n = 0; n < N; n++) scanf("%d%d", &data[n].x, &data[n].y);
        results[t] = overlapping(data, N);
    }
    for(size_t i = 0; i < T; i++) printf("%d\n", results[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬,问下这段代码是什么意思?后面怎么变成了二维数组
int(*data)[2] = (int(*)[2])malloc(4 * count * 2);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

3Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-24 22:59:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 11:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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