题意:

给定N个无序区间。

对合法区间的定义是:

在这个区间之前已经选出了至少l个合法区间,最多选出了r个合法区间。则该区间为合法区间。

输出最多能挑选出多少个合法区间,并输出合法区间的数量。

思路:

先对原来给定的区间按照l从小到达排序。

然后从选了0个合法区间开始,每次在队列中加入l小于等于之前已选合法区间数的区间加入队列, 按照r从小到大进行优先排列。每次从队列中拿出top,当拿出的区间r小于已经找到的区间数时,我们把他放到临时数组里边。每次选出一个合法区间就更新一下队列的成员,将l小于等于当前合法数的都加入队列。直到无法加入并且队列为空停止循环。

最后输出的数字有三部分,包括没有加入队列的,加入队列但是r值较小变成非法区间的和按照一定次序加入队列的。

注意输出格式。

/*************************************************************************
> File Name: D.cpp
> Author: ttpond
> Created Time: 2015-8-22 16:40:42
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<set>
using namespace std;
struct st
{
int l,r,id;
};
st tree[];
bool ccmp(st a,st b)
{
return a.l<b.l;
}
struct cmp
{
bool operator()(const st &a,const st &b)
{
return a.r>b.r;
}
};
int main()
{
int t,tt;
scanf("%d",&t);
for(tt=;tt<t;tt++)
{
int n;
priority_queue<st,vector<st>,cmp>q;
//priority_queue<st,vector<st>,ccmp>s;
scanf("%d",&n);
for(int i=;i<n;i++)
{
tree[i].id=i+;
}
for(int i=;i<n;i++)
{
scanf("%d",&tree[i].l);
}
for(int i=;i<n;i++)
{
scanf("%d",&tree[i].r);
}
sort(tree,tree+n,ccmp);
//for(int i=0;i<n;i++)
//{
// printf("%d %d %d\n",tree[i].l,tree[i].r,tree[i].id);
//}
// int a;
//while(1)
// scanf("%d",&a);
vector<int>tmpp;
vector<int>v;
vector<int>::iterator it;
int sst=;
int num=;
st tmp;
bool ok;
for(;num<n||(!q.empty());)
{
ok=;
while(num<n&&tree[num].l<=sst)
{
q.push(tree[num]);
num++;
ok=;
}
if((!ok)&&q.empty())
{break;}
ok=;
while(!q.empty())
{
tmp=q.top();
q.pop();
if(tmp.r>=sst)
{
sst++;
v.push_back(tmp.id);
ok=;
break;
}
tmpp.push_back(tmp.id);
}
if(!ok)
{break;}
}
ok=;
printf("%d\n",v.size());
for(it=v.begin();it!=v.end();it++)
{
if(it!=v.begin())
printf(" %d",*it);
else
{
ok=;
printf("%d",*it);
}
}
int ttt=;
for(;num<n;num++)
{
if((!ok)&&ttt==)
{
ok=;
printf("%d",tree[num].id);
ttt++;
}
else
{
printf(" %d",tree[num].id);
}
}
//int a;
//while(1)
//{
// scanf("%d",&a);
//}
for(it=tmpp.begin();it!=tmpp.end();it++)
{
if((!ok)&&it==tmpp.begin())
{
printf("%d",*it);
}
else
{
printf(" %d",*it);
}
}
printf("\n");
}
}

HDU 5360 【优先队列+贪心】的更多相关文章

  1. 2015多校第6场 HDU 5360 Hiking 贪心,优先队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须 ...

  2. HDU 5360 (贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:告诉你n个区间[ l[i],r[i] ],然后让你排序,必须左区间不大于它前边的总区间个数 ...

  3. hdu 4544 优先队列+贪心

    题意:最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏.游戏规则很简单,用箭杀死免子即可.箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di ...

  4. HDU 5360 Hiking (贪心)

    题意:邀请 n 参加聚会,如果在邀请第 i 个人之前,已经成功邀请了 x 个人,并且 li <= x <= ri,那么第 i 人才会去,问你怎么排列使得邀请的人最多. 析:对于所有的人,按 ...

  5. 最高的奖励 - 优先队列&贪心 / 并查集

    题目地址:http://www.51cpc.com/web/problem.php?id=1587 Summarize: 优先队列&贪心: 1. 按价值最高排序,价值相同则按完成时间越晚为先: ...

  6. Hdu 4864(Task 贪心)(Java实现)

    Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...

  7. POJ2431 优先队列+贪心 - biaobiao88

    以下代码可对结构体数组中的元素进行排序,也差不多算是一个小小的模板了吧 #include<iostream> #include<algorithm> using namespa ...

  8. hdu3438 Buy and Resell(优先队列+贪心)

    Buy and Resell Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  9. D - 淡黄的长裙 HDU - 4221(贪心)

    D - 淡黄的长裙 HDU - 4221(贪心) James is almost mad! Currently, he was assigned a lot of works to do, so ma ...

  10. hdu 5360 Hiking(优先队列+贪心)

    题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L, ...

随机推荐

  1. prevent to do sth 与 prevent sb (from) doing 用法

    prevent to do sth 如: Do not water in before making a turn every time 9 days, make wilting of its bra ...

  2. AngularJS日期格式化

    本地化日期格式化:({{ today | date:'medium' }})    Mar 28, 2016 6:42:25 PM({{ today | date:'short' }})   3/28 ...

  3. cnbeta新闻资讯第三方客户端应用

    该源码案例是一个cnbeta第三方客户端应用案例,作者ywwxhz,源码cnBeta-reader,cnbeta 的 Android 客户端项目. 源码下载: http://code.662p.com ...

  4. Docker 启动时报错:iptables:No chain/target/match by the name

    重新启动docker后,就好了. service docker restart

  5. uva820 Internet Bandwidth

    就是模板... #include<cstdio> #include<cstring> #include<vector> #include<queue> ...

  6. tree iview treeData json数据 添加 selected 数据 要进行vue.set 进行响应式添加

    tree iview treeData json数据 添加 selected 数据 要进行vue.set 进行响应式添加

  7. BI结构图及自动建表结构图

  8. EBS ORACLE工单齐套率的计算程序

    PROCEDURE Get_wip_accept_item_date(p_use_id in number, p_org_id IN NUMBER, p_start_date IN DATE, p_e ...

  9. ios之AFN

    https://github.com/AFNetworking/AFNetworking 与asi-http-request功能类似的网络库,不过是基于NSURLConnection 和 NSOper ...

  10. 高逼格关闭Win10防火墙

    作为一个开发人员,你还需要进入这个界面来关闭防火墙么? 如果是,那么现在,我将为大家介绍一种高逼格的方式: 第一步: 打开Windows PowerShell(管理员) 第二步:查看当前防火墙状态:n ...