目录
P1918 保龄球
DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷。因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招。
DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位置的瓶子的数量。他突然发现这是一个炫耀自己好视力的借口——他看清远方瓶子的个数后从某个位置发球,这样就能打倒一定数量的瓶子。
-
◯◯◯◯◯◯
-
◯◯◯ ◯◯◯◯ ◯
-
◯◯
-
◯ ◯◯ ◯
如上图,每个 “◯◯” 代表一个瓶子。如果 DL 想要打倒 33 个瓶子就在 11 位置发球,想要打倒 44 个瓶子就在 22 位置发球。
现在他想要打倒 m 个瓶子。他告诉你每个位置的瓶子数,请你给他一个发球位置。
输入格式
第一行包含一个正整数 n,表示位置数。
第二行包含 n 个正整数 ai ,表示第 i 个位置的瓶子数,保证各个位置的瓶子数不同。
第三行包含一个正整数 Q,表示 DL 发球的次数。
第四行至文件末尾,每行包含一个正整数 m,表示 DL 需要打倒 m 个瓶子。
输出格式
共 Q 行。每行包含一个整数,第 i 行的整数表示 DL 第 i 次的发球位置。若无解,则输出 0。
输入输出样例
输入 #1
5 1 2 4 3 5 2 4 7
输出 #1
3 0
说明/提示
【数据范围】
对于 50%50% 的数据,1≤n,Q≤1000,1≤ai,m≤105。
对于 100%100% 的数据,1≤n,Q≤100000,1≤ai,m≤109。
思路
这题可以用map去做,分别定义一个int的键和int的值,一个用于存储位置,另一个用于存储相应位置的瓶子数。
map<int,int>mp;
注意map使用
格式:map<typename1,typename2>mp
typename1是关键字key的类型,typename2是值value的类型,mp是名字
1,ps:关键字是唯一的,而值不唯一
2,ps:如果是字符串到整形的映射,必须使用string而不能用char数组
map存储
在做这道题时,存储map的值时应该把瓶子数和位置调换,这样方便后方的位置判断
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
mp.insert(make_pair(x,i));
}
判断
用map判断是否有位置的瓶子数是要打到的瓶子数
while(q--)
{
cin>>a;
if(mp[a]>=1&&mp[a]<=5)
{
cout<<mp[a]<<endl;
}
else
{
cout<<"0";
}
cout<<endl;
}
代码
#include<bits/stdc++.h>
using namespace std;
int n,q,a;
int main()
{
cin>>n;
map<int,int>mp;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
mp.insert(make_pair(x,i));
}
cin>>q;
while(q--)
{
cin>>a;
if(mp[a]>=1&&mp[a]<=5)
{
cout<<mp[a];
}
else
{
cout<<"0";
}
cout<<endl;
}
return 0;
}
反思
这题每次输出都要换行如果没有换行的话是0分(一开始没打换行,害我找了好久的错误)
其次就是map如果没找到相应键对应的值就会输出0,所有完全没有必要判断
最后的成品
#include<bits/stdc++.h>
using namespace std;
int n,q,a;
int main()
{
cin>>n;
map<int,int>mp;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
mp.insert(make_pair(x,i));
}
cin>>q;
while(q--)
{
cin>>a;
cout<<mp[a]<<endl;
}
return 0;
}