HDU 6301 (贪心+优先队列)


题目大意:

求一个长度为n的数列, 给出m个区间,这m个区间各自区间内的数不同

题解:

用优先队列来模拟过程 , 解题思路是想到了 , 可是不知道如何实现 , 果然还须继续努力呀

这道题思路是去掉重复的区间(取最大的区间,用sort+结构体加几个判断条件来实现),用优先队列维护1-n 中没有出现的数(比如给你一个10 3 [2 8] [1 5] [6 10] 的样例,把1 到 10 push进优先队列后,排序后[1 5] 这个区间先,所以先从优先队列里取1 2 3 4 5,此时队列剩下6 7 8 9 10,下个区间 [2 8] ,我们先把[ 1 2 )这个区间也就是上次剩下的数丢到优先队列里面去。现在优先队列剩下 1 6 7 8 9 10 ,需要从里面取出8 - 5 个数,所以结果现在是1 2 3 4 5 1 6 7 。下个区间[ 6 10 ] ,丢[2 6)这个区间的数进优先队列,也就是 2 3 4 5 这四个数。再从这四个数取 10 - 8 个,所以答案是

1 2 3 4 5 1 6 7 2 3)

参考博客https://blog.csdn.net/YVVVVY/article/details/81186755

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std ;
int n,m;
int ans[100001];
struct no
{
    int u,v;
}a[100001];
bool cmp(no a , no b)
{
    if(a.u==b.u)
    return a.v>b.v;
    return a.u<b.u;
}
priority_queue <int,vector<int>,greater<int> > que;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {


        scanf("%d%d",&n,&m);
        for(int i=0 ; i<m ; i++)
        {
            scanf("%d%d",&a[i].u,&a[i].v);

        }

        sort(a,a+m,cmp);
            while(!que.empty())
           que.pop();

        for(int i=1 ; i<=n ; i++)
        ans[i]=1;
        for(int i=1 ; i<=n ; i++)
        que.push(i);
        int l,r,Tr,Tl;
        l=r=0;
        Tl=a[0].u;
        Tr=Tl-1;
        for(int i=0 ; i<m ; i++)
        {
            if(a[i].u>l && a[i].v >r)
            {
                r=a[i].v;
                l=a[i].u;

                for(int j=Tl ; j<l ; j++)
                que.push(ans[j]);

                for(int j=Tr+1 ; j<=r ; j++)
                {
                    ans[j]=que.top();
                    que.pop();

                }
                Tr=r;Tl=l;
            }
        }
        printf("%d",ans[1]);
        for(int i = 2;i <= n;i++){
            printf(" %d",ans[i]);
        }
        puts("");

    }
}
View Code

优质内容筛选与推荐>>
1、AR手游《悠梦》再发新版本,网易的“AR梦”能否成真?
2、微服务实战(四):落地微服务架构到直销系统(将生产者与消费者接入消息总线)
3、解决Scrollview嵌套recyclerview不能显示,高度不正常的问题
4、针对事件驱动架构的SpringCloudStream
5、如何在Debian9上安装MariaDB


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn