1. 程式人生 > >NOIP複賽複習(七)STL容器與字串模板

NOIP複賽複習(七)STL容器與字串模板

STL容器

STL 容器是一些模板類,提供了多種組織資料的常用方法。常用的STL容器包括pair(組合)、list(列表,類似於連結串列)、vector(向量,類似於陣列)、priority_queue(優先佇列)、set(集合)、map(對映)、stack(棧)等,通過模板的引數我們可以指定容器中的元素型別。


1pair

相當於一個Struct,訪問方式舉個例子:pair<int,int> p; 那麼第一個成員便是p.first、第二個p.secondpair使用起來很方便,簡單快速高效,可以當做一個二元struct使用,而且它定義了比較的方法,先根據第一個成員比較,在根據第二個,所以如果你的比較運算子是這樣,那麼你就不需要定義比較函數了,而

struct是不能直接進行比較的,構造pair的方法:make_pair。例:

#include <cstdio>  

#include <algorithm>  

#include <cstring>  

#include <utility>  

#include <functional>  

using namespace std;  

const int N = 1010;  

typedef pair<int, int> p;  

p a[N];  

int main() {  

    int k = 0;  

    a[k++] = p(3, 4);  

    a[k++] = p(3, 100);  

    a[k++] = p(1, 2);  

    a[k++] = p(4, 10);  

    sort(a, a+k, greater<p>());  

    for (int i = 0; i < k; i++) printf("%d %d\n", a[i].first, a[i].second);  

    return 0;  

}  


2List

list是一個迴圈連結串列。這個容器的特點:快速插入和刪除。作用和vector差不多,但內部是用連結串列實現。這個容器不支援隨機訪問,你不能[]或者利用通用演算法操作,比如說要排序的話你只能利用成員函式比如list.sort(),而且很重要的一點,listsize()函式是線性的,因為是以遍歷函式distance實現的。

例:HDU 5127

#include <cstdio>  

#include <algorithm>  

#include <cstring>  

#include <list>  

#include <utility>  

using namespace std;  

typedef long long LL;  

typedef pair<LL, LL> p;  

list<p> l;  

int main() {  

    int n;  

    while (scanf("%d", &n), n) {  

        l.clear();  

        for (int i = 0; i < n; i++) {  

            LL a, b;  

            int t;  

            scanf("%d %I64d %I64d", &t, &a, &b);  

            if (t == 1) l.push_back(p(a, b));  

            else if (t == -1) l.erase(find(l.begin(), l.end(), p(a, b)));  

            else {  

                list<p>::iterator i = l.begin();  

                LL ans = i->first * a + i->second * b;  

                for (++i; i != l.end(); i++) ans = max(ans, i->first * a + i->second * b);  

                printf("%I64d\n", ans);  

            }  

        }  

    }  

    return 0;  

}   


3vector

相當於一個不定長陣列,利用這個你可以新增任意多的元素,容器以連續陣列的方式儲存元素序列,可以將vector 看作是以順序結構實現的線性表。當我們在程式中需要使用動態陣列時,vector將是一個理想的選擇。這個完全相當於把一個數組當成一個元素來進行使用了,可以直接相等,賦值操作等。比較經典的使用包括:

a、利用vector防止遞迴爆棧。

b、利用vector來實現鄰接表。

c、利用vector儲存空間佔用比較大的矩陣。 


4priority_queue

優先佇列其實就是堆,在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先被刪除。優先佇列具有最高階先出(first in, largest out)的行為特徵。過載有兩種方式:直接在struct或者class內部定義;定義比較結構。

//內部定義:  

struct node{  

   int x, y;  

   node(int x = 0, int y = 0) : x(x), y(y) {}  

   bool operator < (const node &a) const { return x > a.x; }  

};  

priority_queue<node> q;  

//定義比較結構  

struct node{  

   int x, y;  

   node(int x = 0, int y = 0) : x(x), y(y) {}  

};  

struct cmp {  

   bool operator () (const node &a, const node &b) { return a.x< b.x; }  

};  

priority_queue<node, vector<node>,cmp> q;  

priority_queue的應用:貪心

1POJ 2010  

#include <cstdio>  

#include <algorithm>  

#include <cstring>  

#include <queue>  

using namespace std;  

const int N = 100010;  

int l[N], r[N];  

struct calf {  

    int s, a;  

}ca[N];  

bool cmp(calf x, calf y) { return x.s < y.s; }  

int main() {  

    int n, c, f;  

    scanf("%d %d %d", &n, &c, &f);  

    for (int i = 1; i <= c; i++) scanf("%d %d", &ca[i].s, &ca[i].a);  

    sort(ca+1, ca+1+c, cmp);  

    n >>= 1;  

    priority_queue <int> q;  

    int sum = 0;  

    for (int i = 1; i <= n; i++) q.push(ca[i].a), sum += ca[i].a;  

    l[n] = sum;  

    for (int i = n+1; i <= c-n-1; i++) {  

        if (ca[i].a >= q.top()) l[i] = sum;  

        else {  

            sum -= q.top() - ca[i].a;  

            q.pop(); q.push(ca[i].a);  

            l[i] = sum;  

        }  

    }  

    sum = 0;  

    while (!q.empty()) q.pop();  

    for (int i = c; i >= c-n+1; i--) q.push(ca[i].a), sum += ca[i].a;  

    r[c-n+1] = sum;  

    for (int i = c-n; i >= n+2; i--) {  

        if (ca[i].a >= q.top()) r[i] = sum;  

        else {  

            sum -= q.top() - ca[i].a;  

            q.pop(); q.push(ca[i].a);  

            r[i] = sum;  

        }  

    }  

    int ans = -1;  

    for (int i = c-n; i >= n+1; i--) {  

        if (r[i+1] + l[i-1] + ca[i].a <= f) {  

            ans = ca[i].s;  

            break;  

        }  

    }  

    printf("%d\n", ans);  

    return 0;  

}  

priority_queue的應用:加速搜尋

2CSU 1780

#include <cstdio>    

#include <cstring>    

#include <algorithm>    

#include <vector>    

#include <utility>    

#include <queue>    

#define INF 0x3f3f3f3f    

#define LL long long    

相關推薦

NOIP複賽複習STL容器字串模板

STL容器 STL 容器是一些模板類,提供了多種組織資料的常用方法。常用的STL容器包括pair(組合)、list(列表,類似於連結串列)、vector(向量,類似於陣列)、priority_queue(優先佇列)、set(集合)、map(對映)、stack(棧)等,通過模板的引數

NOIP複賽複習STL演算法樹結構模板

STL演算法 STL 演算法是一些模板函式,提供了相當多的有用演算法和操作,從簡單如for_each(遍歷)到複雜如stable_sort(穩定排序),標頭檔案是:#include <algorithm>。常用STL 演算法庫包括:sort快速排序演算法、二分

NOIP複賽複習演算法分析排序模板

演算法分析 演算法分析的目的是預測演算法所需的資源,如計算時間(CPU 消耗)、記憶體空間(RAM 消耗)、通訊時間(頻寬消耗)等,以及預測演算法的執行時間,即在給定輸入規模時,所執行的基本運算元量,或者稱為演算法複雜度。 演算法的執行時間取決於輸入的資料特徵,輸入

NOIP複賽複習競賽環境注意事項

一、比賽不提供紙質試題,只提供電子版試題檔案。 該檔案壓縮包儲存在計算機桌面上。監考人公佈密碼後,選手自行解密試題。 試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。 二、江蘇複賽選手上機可自選windows或linux作業系統。

NOIP複賽複習常見問題常用策略

數學類問題 1. 精度處理(高精度、實數處理、各種浮點型別處理方法) 2. 組合數學問題(斐波那契數列、第二類數、卡特蘭數、Polya原理、排列組合計數、加法原理與乘法原理) 3. 進位制問題(特定二進位制串的統計、二分查詢、利用二進位制進行路徑、狀

NOIP複賽複習十三圖論演算法鞏固提高

一、圖的儲存   1、鄰接矩陣   假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值),  樣例如下圖:   /*無向圖,無權值*/ i

NOIP複賽複習怎樣才能拿到高分?

摘要 考場策略和程式測試是資訊學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。本文將探討一些這兩個環節上值得注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助選手們在比賽中發揮水平,減少失

NOIP複賽複習如何設計測試資料?

有些同學參加一次資訊學比賽之後,自我感覺非常不錯,但是測評結果成績卻並不理想。造成這種情況的原因有多方面,但是我認為其中不可忽視的一大原因就是在寫完程式之後,他們並不知道如何保證程式的正確性。在這裡,我就這個問題提出一點自己的看法。 先從考試的時間分配問題講起。很多同學覺得考試時間很充分,N

NOIP複賽複習程式對拍圖論模板

程式對拍 所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.e

NOIP複賽複習讀寫外掛高精度模板

讀入輸出掛 讀入輸出掛就是逐個字元地讀入資料,從而讓讀入更加快速。輸出掛的原理也是一樣的,都是通過將輸出數字變成輸出字元以加快速度。當然輸入輸出外掛一般用在大量輸入輸出的情況下,這樣價效比才高一些,否則得不償失。 void Rd(int &res){  &nbs

NOIP複賽複習檔案讀寫數論模板

檔案讀入讀出 假設題目名為“add”,那麼資料夾名為“add”,c++程式名為“add.cpp”,讀入檔名為“add.in”,輸出檔名為“add.out”。四個的拼寫均不可有誤,包括大小寫差異。千萬不要除錯後就忘記修改檔案讀入讀出了。  #include<cstdio&

資料結構演算法複習10—— 字尾陣列字串問題

放此待查。 RMQ 問題 http://www.notonlysuccess.com/?p=356 利用字尾陣列求解一個字串中最長重複子串問題 http://cylixstar.blogbus.com/logs/28350301.html http://imlazy.ycool.com/post.20118

NOIP複賽複習十五動態規劃鞏固提高

經典例題:數字金字塔(Luogu 1216)  寫一個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。 我們現在這裡討論搜尋如何實現:  狀態:目前在第x行第y列 

NOIP複賽複習十四字串演算法鞏固提高

一、Trie樹   1.定義: 通過字串建成一棵樹,這棵樹的節點個數一定是最少的。例如:4個字串"ab","abc","bd","dda"對應的trie樹如下: 其中紅色節點表示存在一個字串是以這個點結尾的。  一個性質:在樹上,兩個點u,

NOIP複賽複習十二數論演算法鞏固提高

一、數論    1.數   整數、自然數(大於等於0的整數)、正整數(大於0的整數)、負整數、非負整數、非正整數、非零整數、奇數偶數。   2.整除性   設a,b∈Z,如果存在c∈Z並且a=bc,則

NOIP複賽複習十一基礎演算法鞏固提高

一、倍增演算法:   定義:用f[i][j]表示從i位置出發的2j個位置的資訊綜合(狀態) 一個小小的問題:為什麼是2j而不是3j,5j,…?因為,假設為kj,整個演算法的時間複雜度為(k-1)logk,當k=2時,時間複雜度最小。 這個演算法的三個應用:

JAVA基礎複習多執行緒和網路

1、建立執行緒和任務,如: //任務類必須實現Runnable介面 public class TaskClass implements Runnable{ ... public TaskClass(...){ ... } //想要在該執行緒執行的

javaScript複習Error物件

Error: 1.錯誤/異常處理    錯誤:導致程式無法繼續執行的異常狀態     js中一旦發生錯誤,就會自動建立一個Error型別物件 2、js中的6種錯誤型別,當發生錯誤時,整個程式都無法執行 Synt

Effective STL1——STL容器1-2

說明:由於最近在使用STL寫演算法練習,所以先來把Effective STL這本短小精悍的書,過一遍,讓自己對STL理解更深一點,選擇更合適的容器,能把程式碼寫得規範一點 第1條:慎重選擇容器型別 1.容器的分類 (1)C++標準庫的分類  注意:array和f

Java基礎知識複習-- 中文編碼問題

一、練習-數字對應的中文 找出 E5 B1 8C 這3個十六進位制對應UTF-8編碼的漢字 參考程式碼1 // 找出 E5 B1 8C 這3個十六進位制對應UTF-8編碼的漢字 byte[] bs = new byte[3]; bs[0] = (by