题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2611

方法:

和hdu 2610不一样,该题中要求的顺序除了根据长度外是根据数字大小而不是数字所在的下标,所以不像2610那样有现成的顺序在那里我们只需要去扫描就可以了,所以这里要使用优先队列,但如果对所有的状态都用优先队列来放的话,这会带来很大的时间开销所以,本程序的处理是,

  1,将当前已经探寻到了状态维护在一个一般队列中,并且保证其入队出队顺序和题目要求一致。

  2,当出来一个状态,准备去探索一堆新状态的时候,由于都是同一个状态探寻到的,所以它们携带的数组长度一样,所以这里只需要对大小排序。在由于都是同一个状态探寻到的,所以这些新状态携带的数组就只有最后一个不一样,对大小排序其实就是对最后一个数排序,于是这里先用根绝最后一个数排序的优先队列将其全部压入,然后再一个一个弹出到一般队列,这样就再一次保证了一般队列中的顺序和题目要求一致。

  3.由于不再是根据下标来排序,所以当探寻到的状态节点个数超过要求的输出个数时还要继续探寻,因为在前面探寻到的有可能根据大小排序后就根本不会输出了,后面没有被探寻到的有可能比较小反而可以输出。这个一个让我wa了很久的地方。

感想:该算法虽然ac了,但后面还是要用数学归纳法去证明其正确性。

代码:

View Code

#include <iostream>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
int n,p;
int numbers[101];
int t_numbers[101];
bool visisted[101];
int* arrays[200005];
struct Nums
{int count;int numbersNo;int end;
};
int t_n;
struct cmp
{bool operator()(Nums x,Nums y){if(x.count>y.count)return true;if(x.count==y.count && numbers[x.end]>numbers[y.end])return true;return false;}
};
void  BFSearch(map <int,int>::iterator iter,map <int,int> mp)
{queue<Nums> q;int curr=0;int i =0;priority_queue<Nums,vector<Nums>,cmp> pq2;for(i=0;i<n;i++){iter = mp.find(numbers[i]);if(!visisted[ iter->second]){Nums nums;nums.count=1;nums.end=i;nums.numbersNo=i;arrays[    nums.numbersNo] =new int[1];arrays[    nums.numbersNo][0] = numbers[i];visisted[iter->second] = true;pq2.push(nums);}}while(!pq2.empty()){q.push(pq2.top());pq2.pop();}curr = i;int count =0;while(!q.empty() && count<p){memset(visisted,false,sizeof(visisted));Nums t_nums = q.front();q.pop();count++;for(int j=0;j<t_nums.count-1;j++){printf("%d ",arrays[t_nums.numbersNo][j]);}printf("%d\n",arrays[t_nums.numbersNo][t_nums.count-1]);Nums n_nums;priority_queue<Nums,vector<Nums>,cmp> pq;for(int j=t_nums.end+1;j<n;j++){iter = mp.find(numbers[j]);if(numbers[j]>=numbers[t_nums.end] && !visisted[iter->second] && curr<=200005){visisted[iter->second] = true;n_nums.count = t_nums.count+1;n_nums.end = j;n_nums.numbersNo = curr;arrays[n_nums.numbersNo] = new int[n_nums.count];int x=0;for(x=0;x<t_nums.count;x++)arrays[n_nums.numbersNo][x] = arrays[t_nums.numbersNo][x];arrays[n_nums.numbersNo][x]=numbers[j];pq.push(n_nums);curr++;}}while(!pq.empty()){q.push(pq.top());pq.pop();}delete[]  arrays[t_nums.numbersNo];}
}
void map_insert(map < int, int > *mapStudent, int o, int x)
{ mapStudent->insert(map < int, int >::value_type(o, x));
} void main()
{while(scanf("%d %d",&n,&p)!=EOF){map <int,int>::iterator iter;map <int,int> mp;memset(numbers,0,sizeof(numbers));memset(visisted,false,sizeof(visisted));int k =0;t_n=n;for(int i =0;i<n;i++){scanf("%d",&numbers[i]);iter = mp.find(numbers[i]);if(iter ==mp.end()){map_insert(&mp,numbers[i],k);k++;}}BFSearch(iter,mp);printf("\n");}
}

转载于:https://www.cnblogs.com/kbyd/archive/2013/04/20/3032600.html

[HDU] 2611 Sequence two -优先队列和一般队列一起使用。相关推荐

  1. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  2. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  3. java先进先出 循环队列,JavaScript队列、优先队列与循环队列

    队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先 ...

  4. 优先队列——二项队列(binominal queue)

    [0]README 0.1) 本文文字描述部分转自 数据结构与算法分析, 旨在理解 优先队列--二项队列(binominal queue) 的基础知识: 0.2) 本文核心的剖析思路均为原创(inse ...

  5. HDU - 5919 Sequence II——主席树+区间种类++逆序建树

    [题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...

  6. HDU 3397 Sequence operation(线段树)

    HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...

  7. python循环队列_JS 队列-优先队列、循环队列

    <学习JavaScript数据结构与算法>读书笔记. 队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项.队列再尾部添加新元素,并从顶部移除元素. 在 ...

  8. python 优先队列_python实现最大优先队列 python优先级队列如何最大值优先

    python优先级队列如何最大值优先 啥???????队列默认就有优先级即使告别爱情的时候,也希望你一切都好;小编不再爱你的时候,也许不是小编不爱你,只是,小编已不能再爱你. python3 优先队列 ...

  9. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

最新文章

  1. 一起谈.NET技术,获取ISAPI_Rewrite重写后的URL
  2. matlab基础(0)
  3. eclipse 不能切换输入法
  4. Cell.reuseIdentifier 指什么
  5. java keygenerator_Java密码学KeyGenerator类
  6. MSSql ID自动增长删除数据重1开始
  7. python爬微信头像_使用python itchat包爬取微信好友头像形成矩形头像集的方法
  8. Authorware 函数说明
  9. 韩顺平 2021零基础学Java 学习笔记(1)(自用)
  10. 走进计算机病毒-基础知识
  11. 求推荐一款移动硬盘,日立和西数哪个好?
  12. 程序员戴耳机是为了撩妹子?感觉好酷的样子~
  13. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-TwinCAT自带的找原点功能块MC_Home怎么用
  14. 滴答(DiDa)-客户端体验版上线了
  15. <论文阅读>用于 3D 点线和平面的视觉惯性里程计框架 A Visual Inertial Odometry Framework for 3D Points, Lines and Planes
  16. 用Python做三角形的面积
  17. java 微信定位到市_java 微信公众号地理位置获取
  18. 解析机器人与人工智能领域的创新创业
  19. js符号输入不可用_js 不能输入符号
  20. Element和Node的区别你造吗?

热门文章

  1. python requests下载图片_Python使用urllib库、requests库下载图片的方法比较
  2. 高精度PSEnet文本检测在windows/linux运行教程
  3. 大数据工程师技能图谱
  4. 第一范式转化为第二范式_深度解读《中国智能经济发展白皮书》:AI为核心驱动力,百度给出智能范式...
  5. activity调用fragment的方法_Fragment 的现在以及未来
  6. sqlserver 累计数量_用sqlserver查询累计值
  7. 基于AWT、Swing的GUI程序 - 改变观感
  8. 盘点2012中国承载网十大事件(转)
  9. python实现天气预报_python实现智能语音天气预报
  10. OSChina 周三乱弹 —— 程序员,老了会是怎么样?