题意:

给定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. centos7环境搭建Eureka-Server注册中心集群

    目的:测试和线上使用这套独立的Eureka-Server注册中心集群,目前3台虚拟机集群,后续可直接修改配置文件进行新增或减少集群机器. 系统环境: Centos7x64 java8+(JDK1.8+ ...

  2. Docker下redis的主从配置

    1.拉取redis镜像docker pull redis2.启动3个redis容器服务,分别使用到6379.6380.6381端口docker run --name redis-6379 -p 637 ...

  3. 响应式布局(CSS3弹性盒flex布局模型)

    传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS3引入了更加灵活的弹性布局模型 flex弹性布 ...

  4. uva1153 Keep the Customer Satisfied

    贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可.再处理一下空队列的情况.很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成 ...

  5. autoHeight # 动态高度添加 用 window.addEventListener('resize', function () {

    动态高度添加 用 window.addEventListener('resize', function () { mounted () { this.init() window.addEventLis ...

  6. python程序的编辑和运行、变量

    第一个python程序 python是解释型弱类型高级语言 常见的python解释器CPython.IPython.pypy.JPython.IronPython 方法一.python程序可以写在命令 ...

  7. Unity整合Asp.Net MVC

    先来看一下我们的解决方案 我们建立Yubay.Models项目, using System; using System.Collections.Generic; using System.Data.E ...

  8. dinic网络流

    C - A Plug for UNIX POJ - 1087 You are in charge of setting up the press room for the inaugural meet ...

  9. [HIHO] 1048 铺地板

    历经千辛万苦,小Hi和小Ho终于到达了举办美食节的城市!虽然人山人海,但小Hi和小Ho仍然抑制不住兴奋之情,他们放下行李便投入到了美食节的活动当中.美食节的各个摊位上各自有着非常多的有意思的小游戏,其 ...

  10. ArrayList集合(JDK1.8)

    简述 List是继承于Collection接口,除了Collection通用的方法以外,扩展了部分只属于List的方法. 常用子类  ?ArrayList介绍 1.数据结构 其底层的数据结构是数组,数 ...