寒假训练十(map) id:535

Problem:A 保龄球-map

Description

DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷。因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招。

DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位置的瓶子的数量。他突然发现这是一个炫耀自己好视力的借口——他看清远方瓶子的个数后从某个位置发球,这样就能打倒一定数量的瓶子。

1 OOO

2 OOOO

3 O

4 OO

如上图,每个“O”代表一个瓶子。如果 DL 想要打倒 3 个瓶子就在 1 位置发球,想要打倒 4 个瓶子就在 2 位置发球。

现在他想要打倒 m 个瓶子。他告诉你每个位置的瓶子数,请你给他一个发球位置。

Input

第一行包含一个正整数 n,表示位置数。

第二行包含 n 个正整数,第 i 个数。表示第 i 个位置的瓶子数,保证各个位置的瓶子数不同。

第三行包含一个正整数 Q,表示 DL 发球的次数。

第四行至文件末尾,每行包含一个正整数 m,表示 DL 需要打倒 m 个瓶子。

Output

共 Q 行。每行包含一个整数,第 i 行的整数表示 DL 第 i 次的发球位置。若无解,则输出 0。

Sample Input

5
1 2 4 3 5
2
4
7

Sample Output

3
0

Hint

【数据范围】

对于 50%的数据,1 ≤ n,Q ≤ 1000,1 ≤ai,M ≤ 10^5

对于 100%的数据,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;
}

其实用cout的话即使取消同步也会超时,太魔幻了......

Problem:B 查字典

Description

小明正在复习全国英语四级考试,他手里有一本词典,现在有很多单词要查。请编写程序帮助他快速找到要查的单词所在的页码。

Input

第 1 行 1 个正整数 N,N≤10000,表示字典中一共有多少单词。
接下来每两行表示一个单词,其中:
第 1 行是一个长度小于或等于 100 的字符串,表示这个单词,全部小写字母,单词不会重复。
第 2 行是 1 个整数,表示这个单词在字典中的页码。
接下来的一行是 1 个整数 M,M≤10000,表示要查的单词数。接下来的 M 行,每行一个字符串,表示要查的单词,保证在字典中存在。

Output

M 行,每行一个正整数,表示第 i 个单词在字典中的页码。

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到了北京,领了科技创新奖,但是他还是觉得不满意。原因是,他发现很多人都和他一样获了科技创新奖,特别是其中的某些人,还获得了另一个奖项——特殊贡献奖。而越多的人获得了两个奖项,Miss Medusa就会越眼红。于是她决定统计有哪些人获得了两个奖项,来知道自己有多眼红。

Input

输入第一行,有两个数n,m,表示有n个人获得科技创新奖,m个人获得特殊贡献奖。

第二行,n个正整数,表示获得科技创新奖的人的编号

第三行,m个正整数,表示获得特殊贡献奖的人的编号
Output
输出一行,为获得两个奖项的人的编号,按在科技创新奖获奖名单中的先后次序输出。

注意:本题答案输出一行,最后不需要换行,否则会Presentation Error

Sample Input

4 3
2 15 6 8
8 9 2

Sample Output

2 8

Hint

对于60%的数据,n<=1000,m<=1000

对于100%的数据,n<=100000,m<=100000,获得奖项的人的编号在2e9以内

输入数据保证第二行任意两个数不同,第三行任意两个数不同。

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]捋一遍,获奖则设为真}for(int i=1;i<=n;i++)if(vis[a[i]])//再用a[i]访问一遍,//访问到的自然都获奖a,为真的则获两奖cout<<a[i]<<" ";
return 0;
}

Problem:D 指数序列

Description

伊凡在纸上写下了一个由 n 个非负整数组成的序列 a1 ,a2 ,…,an 。这个序列保证单调不降。
接着,伊凡又在纸上写下了另一个序列 2^a1 ,2^a2 ,…,2^an 。现在他想知道,最少要在这个序列中添加多少个形式为 2^x 的数(x 为非负整数),才能使这个序列所有整数的和为 2^v-1 ,其中 v 为某个非负整数。

Input

(单组输入)
第 1 行包括 1 个正整数 n(1≤n≤1e5 )。
第 2 行包括 n 个由空格隔开的整数a1 ,a2 ,…,an 。其中,0≤ai ≤2×10^9 ,保证 a1 ≤a2 ≤…≤an 。

Output

输出一行一个整数,表示最少在序列中添加数的数量。

Sample Input

4
0 1 1 1

Sample Output

0

Hint

在第1个样例中不需要添加任何数,因为20+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;}

第二天学了set,又看了看学长的博客,发现还能这么用

#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++;//统计被删除的数的个数int k=tmp/2;//将相同的两个数合并,合并后的数大小+1,个数+kif(!vis[x+1]&&k!=0){ans.insert(x+1);//合并后的数大小+1mx=max(mx,x+1);//mx记录合并完成后数的最大值}vis[x+1]+=k;//合并后的数的个数+k}printf("%d\n",mx+1-ans.size()+s);return 0;
}

总结

1.map的定义

map<typename1,typename2> name;

map在建立映射的同时,会自动按照键key从小到大排序。

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

2.map的访问

访问 map 的元素有两种方式,一种是通过下标访问;另一种是通过迭代器访问。
通过下标访问就像普通的数组元素访问,例如先定义map<char,int> mp,然后就可以通过mp[‘c’]的方式来访问它对应的元素,如mp[‘c’]=124。

通过迭代器访问,先作如下定义:

map<typename1,typename2>::iterator it;

因为map的每一对映射都有两个typename,所以,我们使用“it->first”来访问键,而使用“it->second”来访问值。

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 的常用函数

(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)。

4.pair的定义

pair 是“二元结构体”的替代品,将两个元素捆绑在一起,节省编码时间。

pair<typename1,typename2> name;
struct pair{typename1 first;typename2 second;
};
//这两个定义是一样的

5.string的访问

一种访问 string 的方法,就像普通字符数组一样操作。如:

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

如果要读入或者输出整个字符串,一般只能用cin和cout。
如果非要用printf输出string,则需要用c_str()函数将string转换成字符数组。如:

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

寒假训练十(map,pair,string)2020.02.17(4题)相关推荐

  1. 寒假训练八(优先队列)2020.02.14(7题)

    寒假训练八(优先队列)id:530 Problem:A 买饭-优先队列 Description 林大食堂非常拥挤,得排队买饭,陈老师也是一样的! 有n个人在一个卖饭窗口前排队买饭,假如每个人买饭的时间 ...

  2. NEFU 大一寒假训练十二(set)2020.02.18

    Summary 可能是昨天的题少了一些,今天的题多了一堆,还疯狂TLE /(ㄒoㄒ)\~~ Information No. Title AC/Submit A 明明的随机数-set 60/101 B ...

  3. NO.012-2018.02.17《题都城南庄》唐代:崔护

    题都城南庄_古诗文网 题都城南庄 唐代:崔护 去年今日此门中,人面桃花相映红. 去年春天,就在这扇门里,姑娘脸庞,相映鲜艳桃花. 人面:指姑娘的脸.第三句中"人面"指代姑娘. 人面 ...

  4. [XUPT]2020寒假训练---比赛专题

    比赛链接:https://vjudge.net/contest/357216 说明: 比赛难度正好符合寒假训练的同学.(有一两道可能一些同学做过,我们出题没考虑到sorry) 下面对题目进行解答一下. ...

  5. 大一寒假训练九(map,set,vector)【更新完成】

    一.map的应用 洛谷 P1918 保龄球 #include <bits/stdc++.h> using namespace std; map<int,int>a;//实际上就 ...

  6. 一起开心2020蓝桥寒假训练(二)7-6 彩虹瓶 (25分)用到栈,队列

    一起开心2020蓝桥寒假训练(二)7-6 彩虹瓶 (25分) 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按 ...

  7. 牛客网平台常州大学新生寒假训练会试

    A-添加逗号 链接:https://www.nowcoder.net/acm/contest/78/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  8. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  9. hdu1113 Word Amalgamation(详解--map和string的运用)

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/35338617 转载请注明出 ...

最新文章

  1. 3997: [TJOI2015]组合数学
  2. 提示丢失libgcc_s_dw2-1.dll问题
  3. asp.net最常用的三十三种编程代码
  4. 小林求职记(六)踩过Dubbo坑,回答印象深,干货整理
  5. python爬虫xpath提取数据_python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)...
  6. 引用 DetachedCriteria
  7. caffe 利用Python API做分类预测,以及特征的可视化
  8. Conditional Generative Adversarial Nets论文翻译
  9. idea翻译成中文_IDEA使用有道翻译插件
  10. linux 网络编程connection refused,《UNIX网络编程》第一个例子出现“connect error: Connection refused”错误提示信息?...
  11. Ubuntu 20.04.2 LTS安装 最新版 微信(wine)
  12. Linux基础操作篇
  13. 四分位数算法记录(含java代码实现)
  14. 剽悍一只猫---新年分享(2019.12.29)
  15. 随机展示一个汉字,可以用来让一二年级孩子识字
  16. Postman批量参数化测试
  17. 【湍流】基于Matlab模拟高斯光束在湍流大气中传输仿真,得到大气湍流相位屏、以及光斑强度变化
  18. 解读下一代网络:算力网络正从理想照进现实
  19. Linux中断申请之request_threaded_irq
  20. [工具]ToDoList-简单有效的个人任务管理器

热门文章

  1. ubuntu系统文件夹目录说明
  2. 指定搜索词的分词方法——elasticsearch
  3. 考研操作系统题目整理
  4. 市场营销学5——消费者购买行为分析
  5. [Practical.Vim(2012.9)].Drew.Neil.Tip03 学习摘要
  6. 运行TensorFlow出现The TensorFlow library wasn‘t compiled to use FMA instructions)代码
  7. App制作需要哪些技术?
  8. 电脑网络连接不上怎么办
  9. iOS QQ空间 好友分享
  10. LinuX 硬盘分区细节详谈