2020年OJ习题【map】
map翻譯為映射,是STL中的常用容器。其實,數組就是一種映射,比如:int a[100];就是定義了一個int到int的映射。而a[5]=25;就是把5映射到25。數組總是將int類型映射到其它基本類型(稱為數組的基類型),這同時也帶來了一個問題,有時候我們希望把string映射成一個int,數組就不方便了。這時就可以使用map,map可以將任何基本類型(包括STL容器)映射到任何基本類型(包括STL容器)。
要使用map,必須先添加map頭文件,即#include ,同時必須要有“using namespace std”。
定義一個map的方法為:map<typename1,typename2> name;
其中,typename1是映射前的類型(鍵key),typename2是映射后的類型(值value),name為映射的名字。
普通int數組a就是map<int,int> a。而**如果是字符串到整型的映射,就必須使用string,而不能使用char,即map<string,int> a。**map的鍵和值也可以是STL容器,比如:map<set,string> mp。當然,map的鍵和值都是唯一的。
訪問 map 的元素有兩種方式,一種是通過下標訪問;另一種是通過迭代器訪問。
通過下標訪問就像普通的數組元素訪問,例如先定義map<char,int> mp,然后就可以通過mp[‘c’]的方式來訪問它對應的元素,如mp[‘c’]=124。
通過迭代器訪問,先作如下定義:
map<typename1,typename2>::iterator it;
因為map的每一對映射都有兩個typename,所以,我們使用“it->first”來訪問鍵,而使用“it->second”來訪問值。
map常用函數:
(1)find()和 size()
find(key)是返回鍵為 key 的映射的迭代器,時間復雜度為 0(log 2 n),n 為 map 中映射的對數。size()用來獲得map中映射的對數,時間復雜度為O(1)。
(2)clear()
clear()用來清空 map,時間復雜度為 0(n)。
(3)erase()
erase()可以刪除單個元素,也可以刪除一個區間內的所有元素。
刪除單個元素可以用:erase(it),it為要刪除的元素的迭代器,時間復雜度為O(1)。
也可以用:erase(key),key為要刪除的映射的鍵,時間復雜度為O(log2n)。
刪除一個區間內的所有元素用:erase(first,last),first為區間的起始迭代器,last為區間的末尾迭代器的下一個地址,也就是左閉右開的區間[first,last),時間復雜度為O(last-first)。
保齡球-map
map的key存得是保齡球數,value存得是位置
注意這里輸出不能用cout,會超時
查字典
模板題
#include <bits/stdc++.h> using namespace std; map<string,int>vis; string name; int p,m,n; int main() {cin>>n;for(int i=1;i<=n;i++){cin>>name;cin>>vis[name];}cin>>m;for(int i=1;i<=m;i++){cin>>name;cout<<vis[name]<<endl;}return 0;眼紅的Medusa
這題有意思,一開始一直不知道錯哪里了,結果再一看題目,要求按前者的順序輸出hhh。。。。。。
#include <bits/stdc++.h> using namespace std; map<int,int>vis; int x,m,n,a[100005],b[100005];//a存第一個獎項的得主編號,b存兩個獎項的得主編號,x輸入第二個獎項的得主編號 int main() {cin>>n>>m;int cnt=0;for(int i=1;i<=n;i++){cin>>a[i];//第一個獎項得主先不用放map里}for(int i=1;i<=m;i++){cin>>x;vis[x]++;//先放第二個獎項的得主}for(int i=1;i<=n;i++){if(vis[a[i]])//在這里判斷是否是兩個獎項得主b[++cnt]=a[i];}for(int i=1;i<=cnt;i++){i==cnt?cout<<b[i]:cout<<b[i]<<" ";}return 0; }指數序列
萬惡的二進制,一到了這種題,我腦子就不夠用。。。。。。
一個由 n 個非負整數組成的序列 a1 ,a2 ,…,an 。這個序列保證單調不降。
另一個序列 2^a1 ,2^a2 ,…,2^an,最少要在這個序列中添加多少個形式為 2^x 的數(x 為非負整數),才能使這個序列所有整數的和為 2^v-1 ,其中 v 為某個非負整數。
思考到用二進制的思想(不然都是2的冪次是干嘛的。。。。。。)
只有當二進制的每一位都是1的時候才滿足題意,有幾個0,就加上幾個數,這就是最少的,因此題目的意思就是要找二進制有幾位是0,考慮到題目的數范圍很大,因此不能用數組,要用map,而且要注意,正因為序列是不降的,所以需要進位,有兩個相同的就要進一位!
但是還不能直接找0的個數,因為 序列是單調不降的,所以map的第一個必定是第一個寫入的數,這個數可能不是0,比如說第一個數是3,那么后續的數都是>=3的,所以其實隱藏了第一位,第二位也是0,但是現在直接在map找0,是找不到這兩個的,所以要找有多少個1,再找一共有多少位,(這里應該是map里的最高位+1,因為還有第一位(自己理解一下就能明白)),他們的差就是結果了!
總結
以上是生活随笔為你收集整理的2020年OJ习题【map】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Multisim开启高频电路仿真(1)高
- 下一篇: 橡皮擦是黑色的