1. 程式人生 > >UVa540 佇列 UVa136 優先佇列

UVa540 佇列 UVa136 優先佇列

UVa540

採用資料結構與大概流程

1.使用map<int,int> 來儲存隊伍序號與隊員的關係
2.用queue<int> 來模擬佇列的操作
不難

程式碼實現

#include<iostream>
#include<queue>
#include <map>
#include <string>
using namespace std;

int main()
{
    int N, t;
    int num;
    int count = 1;
    map<int, int> savedMember; //隊員名稱 佇列序號 
queue<int> print;//用於輸出操作 while (true) { queue<int> q;//team queue queue<int> p[1001];//單個佇列 //輸入 cin >> t; if (!t) break; for (int i = 1; i <= t; i++) { cin >> N; for (int
j = 0; j < N; j++) { cin >> num; savedMember.insert({ num,i }); } } //處理輸入指令 string order; while (true) { cin >> order; if (order[0] == 'S') break; else
if (order[0] == 'E') //enqueue 101 { cin>>num; int temp = savedMember[num]; if (p[temp].empty()) q.push(temp); p[temp].push(num); } else if (order[0] == 'D') { //cout << p[q.front()].front() << endl; print.push(p[q.front()].front()); p[q.front()].pop(); if (p[q.front()].empty()) q.pop(); } } cout << "Scenario #"<<count << endl; count++; while (!print.empty()) { cout << print.front()<<endl; print.pop(); } cout << endl; //重新整理資料結構儲存狀態 savedMember.clear(); } //system("pause"); return 0; }

UVa136

採用資料結構與大概流程

1.採用STL優先佇列priority_queue來生成醜數,先將1放入佇列,每次pop頭出來,當pop1500次時即得出結果
priority_queue<type,container,function> type是資料的型別,container為實現優先佇列的底層容器,function為元素間的比較方式,預設priority_queue<int,vector<int>> 優先順序是越小的整數優先順序越低,但這題我們要從小到大生成醜數,所以越小的整數需要優先順序越高,所以使用greater<>注意需要加入標頭檔案#include<functional>

程式碼實現

/*思路:從最小的1開始生成醜數
每次從優先佇列中取出最小的醜數依次*2,*3,*5
然後放入越小越優先的優先佇列中
需要比較這個新生成的醜數是否之前生成過
用set可以實現
*/

#include<iostream>
#include<set>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
typedef long long ll;
const int a[3]= { 2,3,5 };

int main()
{
    int count = 1;
    priority_queue<ll, vector<ll>, greater<ll> > p;
    set<ll> Set;
    p.push(1);
    Set.insert(1);
    while (true)
    {
        ll x = p.top();
        p.pop();
        if (count == 1500)
        {
            cout <<"The 1500'th ugly number is "<<x<<"."<<endl;
            break;
        }
        for (int i = 0; i < 3; i++)
        {
            ll y = x;
            y = y*a[i];
            if (Set.count(y) == 0)
            {
                Set.insert(y);
                p.push(y);
                //cout << y << endl;
            }
        }
        count++;
    }
    system("pause");
    return 0;
}