日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

寒假训练十(map,pair,string)2020.02.17(4题)

發(fā)布時(shí)間:2024/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寒假训练十(map,pair,string)2020.02.17(4题) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寒假訓(xùn)練十(map) id:535

Problem:A 保齡球-map

Description

DL 算緣分算得很煩悶,所以常常到體育館去打保齡球解悶。因?yàn)樗}g球已經(jīng)打了幾十年了,所以技術(shù)上不成問(wèn)題,于是他就想玩點(diǎn)新花招。

DL 的視力真的很不錯(cuò),竟然能夠數(shù)清楚在他前方十米左右每個(gè)位置的瓶子的數(shù)量。他突然發(fā)現(xiàn)這是一個(gè)炫耀自己好視力的借口——他看清遠(yuǎn)方瓶子的個(gè)數(shù)后從某個(gè)位置發(fā)球,這樣就能打倒一定數(shù)量的瓶子。

1 OOO

2 OOOO

3 O

4 OO

如上圖,每個(gè)“O”代表一個(gè)瓶子。如果 DL 想要打倒 3 個(gè)瓶子就在 1 位置發(fā)球,想要打倒 4 個(gè)瓶子就在 2 位置發(fā)球。

現(xiàn)在他想要打倒 m 個(gè)瓶子。他告訴你每個(gè)位置的瓶子數(shù),請(qǐng)你給他一個(gè)發(fā)球位置。

Input

第一行包含一個(gè)正整數(shù) n,表示位置數(shù)。

第二行包含 n 個(gè)正整數(shù),第 i 個(gè)數(shù)。表示第 i 個(gè)位置的瓶子數(shù),保證各個(gè)位置的瓶子數(shù)不同。

第三行包含一個(gè)正整數(shù) Q,表示 DL 發(fā)球的次數(shù)。

第四行至文件末尾,每行包含一個(gè)正整數(shù) m,表示 DL 需要打倒 m 個(gè)瓶子。

Output

共 Q 行。每行包含一個(gè)整數(shù),第 i 行的整數(shù)表示 DL 第 i 次的發(fā)球位置。若無(wú)解,則輸出 0。

Sample Input

5 1 2 4 3 5 2 4 7

Sample Output

3 0

Hint

【數(shù)據(jù)范圍】

對(duì)于 50%的數(shù)據(jù),1 ≤ n,Q ≤ 1000,1 ≤ai,M ≤ 10^5

對(duì)于 100%的數(shù)據(jù),1 ≤ n,Q ≤ 100000,1 ≤ai,M ≤ 10^9

code

#include<bits/stdc++.h> using namespace std; map<int,int>v; int main() {ios::sync_with_stdio(false);int n,m,x,q,f;cin>>n;for(int i=1;i<=n;i++){cin>>x;v[x]=i;}cin>>q;while(q--){cin>>m;cout<<v[m]<<endl;}return 0; }

其實(shí)用cout的話即使取消同步也會(huì)超時(shí),太魔幻了......

Problem:B 查字典

Description

小明正在復(fù)習(xí)全國(guó)英語(yǔ)四級(jí)考試,他手里有一本詞典,現(xiàn)在有很多單詞要查。請(qǐng)編寫(xiě)程序幫助他快速找到要查的單詞所在的頁(yè)碼。

Input

第 1 行 1 個(gè)正整數(shù) N,N≤10000,表示字典中一共有多少單詞。
接下來(lái)每?jī)尚斜硎疽粋€(gè)單詞,其中:
第 1 行是一個(gè)長(zhǎng)度小于或等于 100 的字符串,表示這個(gè)單詞,全部小寫(xiě)字母,單詞不會(huì)重復(fù)。
第 2 行是 1 個(gè)整數(shù),表示這個(gè)單詞在字典中的頁(yè)碼。
接下來(lái)的一行是 1 個(gè)整數(shù) M,M≤10000,表示要查的單詞數(shù)。接下來(lái)的 M 行,每行一個(gè)字符串,表示要查的單詞,保證在字典中存在。

Output

M 行,每行一個(gè)正整數(shù),表示第 i 個(gè)單詞在字典中的頁(yè)碼。

Sample Input

2 scan 10 word 15 2 scan word

Sample Output

10 15

code

#include<bits/stdc++.h> using namespace std; map<string,int>vis; int main() {int n,m,x,y;string w;cin>>n;while(n--){cin>>w>>x;vis.insert(pair<string, int>(w,x));}cin>>m;while(m--){cin>>w;cout<<vis[w]<<endl;}return 0; }

Problem:C 眼紅的Medusa

Description

雖然Miss Medusa到了北京,領(lǐng)了科技創(chuàng)新獎(jiǎng),但是他還是覺(jué)得不滿意。原因是,他發(fā)現(xiàn)很多人都和他一樣獲了科技創(chuàng)新獎(jiǎng),特別是其中的某些人,還獲得了另一個(gè)獎(jiǎng)項(xiàng)——特殊貢獻(xiàn)獎(jiǎng)。而越多的人獲得了兩個(gè)獎(jiǎng)項(xiàng),Miss Medusa就會(huì)越眼紅。于是她決定統(tǒng)計(jì)有哪些人獲得了兩個(gè)獎(jiǎng)項(xiàng),來(lái)知道自己有多眼紅。

Input

輸入第一行,有兩個(gè)數(shù)n,m,表示有n個(gè)人獲得科技創(chuàng)新獎(jiǎng),m個(gè)人獲得特殊貢獻(xiàn)獎(jiǎng)。

第二行,n個(gè)正整數(shù),表示獲得科技創(chuàng)新獎(jiǎng)的人的編號(hào)

第三行,m個(gè)正整數(shù),表示獲得特殊貢獻(xiàn)獎(jiǎng)的人的編號(hào)
Output
輸出一行,為獲得兩個(gè)獎(jiǎng)項(xiàng)的人的編號(hào),按在科技創(chuàng)新獎(jiǎng)獲獎(jiǎng)名單中的先后次序輸出。

注意:本題答案輸出一行,最后不需要換行,否則會(huì)Presentation Error

Sample Input

4 3
2 15 6 8
8 9 2

Sample Output

2 8

Hint

對(duì)于60%的數(shù)據(jù),n<=1000,m<=1000

對(duì)于100%的數(shù)據(jù),n<=100000,m<=100000,獲得獎(jiǎng)項(xiàng)的人的編號(hào)在2e9以內(nèi)

輸入數(shù)據(jù)保證第二行任意兩個(gè)數(shù)不同,第三行任意兩個(gè)數(shù)不同。

code

#include<bits/stdc++.h> using namespace std; int n,m; map<int,int> vis; int a[111111],b[111111]; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d",&b[i]);vis[b[i]]=1;//用b[i]捋一遍,獲獎(jiǎng)則設(shè)為真}for(int i=1;i<=n;i++)if(vis[a[i]])//再用a[i]訪問(wèn)一遍,//訪問(wèn)到的自然都獲獎(jiǎng)a,為真的則獲兩獎(jiǎng)cout<<a[i]<<" "; return 0; }

Problem:D 指數(shù)序列

Description

伊凡在紙上寫(xiě)下了一個(gè)由 n 個(gè)非負(fù)整數(shù)組成的序列 a1 ,a2 ,…,an 。這個(gè)序列保證單調(diào)不降。
接著,伊凡又在紙上寫(xiě)下了另一個(gè)序列 2^a1 ,2^a2 ,…,2^an 。現(xiàn)在他想知道,最少要在這個(gè)序列中添加多少個(gè)形式為 2^x 的數(shù)(x 為非負(fù)整數(shù)),才能使這個(gè)序列所有整數(shù)的和為 2^v-1 ,其中 v 為某個(gè)非負(fù)整數(shù)。

Input

(單組輸入)
第 1 行包括 1 個(gè)正整數(shù) n(1≤n≤1e5 )。
第 2 行包括 n 個(gè)由空格隔開(kāi)的整數(shù)a1 ,a2 ,…,an 。其中,0≤ai ≤2×10^9 ,保證 a1 ≤a2 ≤…≤an 。

Output

輸出一行一個(gè)整數(shù),表示最少在序列中添加數(shù)的數(shù)量。

Sample Input

4
0 1 1 1

Sample Output

0

Hint

在第1個(gè)樣例中不需要添加任何數(shù),因?yàn)?0+21+21+21 =1+2+2+2=7=2^3-1。

code

#include<bits/stdc++.h> using namespace std; int n,ans; int main(){cin>>n;long long s=0;for(int i=1;i<=n;i++){int t;cin>>t;s +=(1<<t);}while(s){int t=s%2;s/=2;if(t==0) ans++;} printf("%d\n",ans);return 0;}

第二天學(xué)了set,又看了看學(xué)長(zhǎng)的博客,發(fā)現(xiàn)還能這么用

#include <bits/stdc++.h> using namespace std; int n,x,s,mx; set<int>ans; map<int,int>vis; int main() {ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++){cin>>x;vis[x]++;ans.insert(x);mx=max(mx,x);}for(set<int>::iterator it=ans.begin();it!=ans.end();it++){x=*it;int tmp=vis[x];vis[x]=tmp%2;if(vis[x]==0)s++;//統(tǒng)計(jì)被刪除的數(shù)的個(gè)數(shù)int k=tmp/2;//將相同的兩個(gè)數(shù)合并,合并后的數(shù)大小+1,個(gè)數(shù)+kif(!vis[x+1]&&k!=0){ans.insert(x+1);//合并后的數(shù)大小+1mx=max(mx,x+1);//mx記錄合并完成后數(shù)的最大值}vis[x+1]+=k;//合并后的數(shù)的個(gè)數(shù)+k}printf("%d\n",mx+1-ans.size()+s);return 0; }

總結(jié)

1.map的定義

map<typename1,typename2> name;

map在建立映射的同時(shí),會(huì)自動(dòng)按照鍵key從小到大排序。

map的二維表示
map<int,map<int,int> >vis; map<pair<int,int>,int>vis;

2.map的訪問(wèn)

訪問(wèn) map 的元素有兩種方式,一種是通過(guò)下標(biāo)訪問(wèn);另一種是通過(guò)迭代器訪問(wèn)。
通過(guò)下標(biāo)訪問(wèn)就像普通的數(shù)組元素訪問(wèn),例如先定義map<char,int> mp,然后就可以通過(guò)mp[‘c’]的方式來(lái)訪問(wèn)它對(duì)應(yīng)的元素,如mp[‘c’]=124。

通過(guò)迭代器訪問(wèn),先作如下定義:

map<typename1,typename2>::iterator it;

因?yàn)閙ap的每一對(duì)映射都有兩個(gè)typename,所以,我們使用“it->first”來(lái)訪問(wèn)鍵,而使用“it->second”來(lái)訪問(wèn)值。

map<typename1, typename2>::iterator it; int main() {map<char, int> mp;mp['m'] = 20;mp['r'] = 30;mp['a'] = 40;for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {printf("%c %d\n", it -> first, it -> second);}return 0; }

3.map 的常用函數(shù)

(1)find()和 size()
find(key)是返回鍵為 key 的映射的迭代器,時(shí)間復(fù)雜度為 0(log 2 n),n 為 map 中映射的對(duì)數(shù)。size()用來(lái)獲得map中映射的對(duì)數(shù),時(shí)間復(fù)雜度為O(1)。
(2)clear()
clear()用來(lái)清空 map,時(shí)間復(fù)雜度為 0(n)。
(3)erase()
erase()可以刪除單個(gè)元素,也可以刪除一個(gè)區(qū)間內(nèi)的所有元素。
刪除單個(gè)元素可以用:erase(it),it為要?jiǎng)h除的元素的迭代器,時(shí)間復(fù)雜度為O(1)。
也可以用:erase(key),key為要?jiǎng)h除的映射的鍵,時(shí)間復(fù)雜度為O(log2n)。
刪除一個(gè)區(qū)間內(nèi)的所有元素用:erase(first,last),first為區(qū)間的起始迭代器,last為區(qū)間的末尾迭代器的下一個(gè)地址,也就是左閉右開(kāi)的區(qū)間[first,last),時(shí)間復(fù)雜度為O(last-first)。

4.pair的定義

pair 是“二元結(jié)構(gòu)體”的替代品,將兩個(gè)元素捆綁在一起,節(jié)省編碼時(shí)間。

pair<typename1,typename2> name; struct pair{typename1 first;typename2 second; }//這兩個(gè)定義是一樣的

5.string的訪問(wèn)

一種訪問(wèn) string 的方法,就像普通字符數(shù)組一樣操作。如:

string str= “ abcd “ ; for(int i = 0; i < str.length(); i++) printf(%c “ ,str[i]); // 輸出 abcd

如果要讀入或者輸出整個(gè)字符串,一般只能用cin和cout。
如果非要用printf輸出string,則需要用c_str()函數(shù)將string轉(zhuǎn)換成字符數(shù)組。如:

string str; cin>>str; cout<<str<<endl; printf("%s\n",str.c_str());

總結(jié)

以上是生活随笔為你收集整理的寒假训练十(map,pair,string)2020.02.17(4题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。