用佇列對撲克牌排序 -優先佇列法
#include <iostream> #include <queue> #include<cstdio> #include<stdlib.h> using namespace std; struct Node{ char x; char y; int i; Node( int a= 0, int b= 0,int c=0 ): x(a), y(b),i(c) {}; }; bool operator<( Node a, Node b ){ return a.i>b.i; } char s[2],s1,s2; char ans[10010]; priority_queue<Node> q[13]; int main(){ //freopen("2.out","w",stdout); int i,j,flag,n; char l; cin>>n; for(i= 0; i< n; ++i ) { scanf("%s",s); s1=s[0],s2=s[1]; q[s2-'0'-1].push(Node(s1,s2,i)); } j=0; for(i=0;i<9;i++) { flag=0; cout<<"Queue"<<i+1<<":"; while( !q[i].empty() ){ if(!flag) { cout << q[i].top().x<< q[i].top().y ; flag=1; } else cout <<" "<<q[i].top().x<< q[i].top().y ; s1=q[i].top().x;s2=q[i].top().y; q[s1-'A'+9].push(Node(s2,s1,j)); q[i].pop(); j++; } cout<<endl; } j=0; for(;i<13;i++) { flag=0; l='A'+i-9; cout<<"Queue"<<l<<":"; while(!q[i].empty()) { if(!flag) { cout << q[i].top().y<< q[i].top().x; flag=1; } else cout <<" "<<q[i].top().y<< q[i].top().x; s1=q[i].top().y;s2=q[i].top().x; ans[j++]=s1;ans[j++]=s2; q[i].pop(); } cout<<endl; } for(i=0;i<j;i+=2) { if(i==0) cout<<ans[i]<<ans[i+1]; else cout<<" "<<ans[i]<<ans[i+1]; } cout<<endl; return 0; }
相關推薦
用佇列對撲克牌排序 -優先佇列法
#include <iostream> #include <queue> #include<cstdio> #include<stdlib.h> using namespace std; struct Node{ char x; char y;
sort對vector中pair排序+優先佇列的排序
//對vector中的 pair排序 vector<pair<int,char>>V; bool cmp(const pair<int,char> a, cons
hdu1285確定比賽名次(拓撲排序+優先佇列)
傳送門 第一道拓撲排序題 每次刪除入度為0的點,並輸出 這題要求隊名小的排前面,所以要用到過載的優先佇列 1 #include<bits/stdc++.h> 2 using namespace std; 3 priority_queue<int,vec
hdu 4857 逃生(反向拓撲排序+優先佇列)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7786  
Running Median POJ - 3784 (對頂堆/優先佇列)
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (m
Minimal Labels CodeForces - 825E (反向拓撲排序+優先佇列)
傳送門 題意:有一個有向無環圖,然後要給每個結點附上標籤,如果從v到u有一條邊,那麼v的標籤小於u的標籤,那麼v的標籤要小於u的標籤,最後使得從頂點1到頂點n的字典序最小,輸出這個字典序 題解:這題一眼看上去用拓撲排序,然後拍了個正向拓撲排序+每次找出最小的進入佇列中進行查詢,wa6,仔細分
演算法 —— 排序 —— 優先佇列
優先佇列 【Priority Queue】 首先宣告一下,優先佇列是基於堆的完全二叉樹,它和佇列的概念無關。(它並不是佇列,而是樹) 並且,優先佇列最重要的操作就是: 刪除最大元素和插入元素,所以我們把精力集中在這兩點上。(本文以最大堆為主講述)
hdoj 4857 逃生(逆向拓撲排序+優先佇列)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2161 Accepted Submissio
《演算法(第四版)》排序-----優先佇列
在實際應用中,我們常常不一定要求整個陣列全部有序,或者不需要一次就將它們排序,可能只需要當前陣列的鍵值最大的元素或最小的元素,這時就類似於總在處理下一個優先順序最高的元素,在這種情況下一個合適的資料結構應該支援兩種操作:刪除最大元素和插入元素。這種型別叫做優先佇列 實
HDU 4857 逃生 (反向拓撲排序+優先佇列)
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis
堆 堆排序 優先佇列 圖文詳解(Golang實現)
引入 在實際應用中,我們經常需要從一組物件中查詢最大值或最小值。當然我們可以每次都先排序,然後再進行查詢,但是這種做法效率很低。哪麼有沒有一種特殊的資料結構,可以高效率的實現我們的需求呢,答案就是堆(heap) 堆分為最小堆和最大堆,它們的性質相似,我們以最小堆為例子。 最小堆 舉例 如上圖所示,就為一個
HashMap與HashCode有關,用Sort對象排序
ati 排序 spa main i++ map nbsp col static 遍歷Map,使用keySet()可以返回set值,用keySet()得到key值,使用叠代器遍歷,然後使用put()得到value值。 上面這個算法的關鍵語句: Set s=m.keySet
用TreeMap對key排序
//按年份,取出最近10項 List<StatisticalData> projectYear = statisticalInfo.getProjectYear(); Map<String,String> treeMap
用linq對陣列排序及簡單運算
// 初始陣列 int[] arr = { 8, 10, 5, 6, 45, 676, 20, 35 }; // 對其按升序排序
.Kruskal演算法 優先佇列+並查集,用優先佇列代替排序。
程式碼 /* 思路,將邊集加入到最小優先佇列,每次取出一個最小邊,如果邊的兩個端點有一個沒有訪問過,說明加入這條邊,就沒有構成環。可以加入。 突然發現這個思路是錯的。判斷是不是環,我的說法是錯誤的。還沒有想到解決辦法。 如果解決了:加入一條邊
優先佇列或堆及堆排序介紹
1 堆的基本概念 堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結構,堆分為兩種,最大堆,最小堆。 最大堆:根節點大於左右兩個子節點的完全二叉樹 最小堆:根節點小於左右兩個子節點的完全二叉樹 堆可以用陣列來儲存,a[i]處存根節點,a[2*i] a[2*i + 1]分別存左子樹的
leetcode692+出現次數做多的K單詞,優先佇列,注意重寫排序語法
https://leetcode.com/problems/top-k-frequent-words/description/ struct cmp{ bool operator()(pair<int,string>a, pair<int, string>b)
演算法-優先佇列與堆排序
優先佇列 許多應用程式都需要處理有序的元素,但不一定要求他們全部有序,或是不一定要一次就將他們排序。很多情況下我們會收集一些元素,處理當前鍵值最大的元素,然後再收集更多元素,再處理當前鍵值最大的元素,如此這般。 在這種情況下,一個合適的資料結構應該支援兩種操作:刪除最大元素和插入元素。
【51Nod - 1163】最高的獎勵 (貪心+優先佇列 或 妙用並查集)
題幹: 有N個任務,每個任務有一個最晚結束時間以及一個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每一個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。 Input 第1行:一個數N,表示