#include <bits/stdc++.h>
using namespace std;
map<string,int>a;
int main()
{
string word,inquire;//inquire为要查询的单词
int m,n,page;
ios::sync_with_stdio(false);
cin>>n;
while(n--)
{
cin>>word>>page;
a[word]=page;
}
cin>>m;
while(m--)
{
cin>>inquire;
printf("%d\n",a[inquire]);
}
return 0;
}
nefu 1675 中间数
因为开数组开不到1e9那么大,所以只能用vector存数据了。
(vector是一个能够存放任意类型的动态数组,能够增加和压缩数据)
#include <bits/stdc++.h>
using namespace std;
vector<int>a;
int main()
{
int i,n,x;
while(cin>>x&&x)
a.push_back(x);//从a[0]开始存储
n=a.size();
if(n&1) printf("%d\n",a[(n-1)/2]);
else printf("%d\n",a[(n-1)/2]+a[n/2]);
return 0;
}
这题注意数据范围,获得奖项的人的编号在2e9以内,那么flag(记录某个编号在第二行是否出现)就不能用普通数组,只能用map。
如果把flag写成了普通数组,因为flag的数组大小不够,无法记录2e9这么大的编号是否出现,提交会Runtime Error,先上错误示范:(只要改一个地方就能AC)
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int flag[100010];
int ans[100010];
int main()
{
int n,m,x,i;
ios::sync_with_stdio(false);
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=m;i++)
{
cin>>x;
flag[x]=1;
}
int t=0;
for(i=1;i<=n;i++)
{
if(flag[a[i]]==1)
ans[++t]=a[i];
}
for(i=1;i<=t-1;i++)
printf("%d ",ans[i]);
printf("%d",ans[t]);
return 0;
}
flag数组开小了,所以 Runtime Error: Segmentation fault,但是数组开不到2e9那么大(最大也不过1e7)
这时候只要把 flag[100010] 改成 map<int,int>flag 就能AC了:
#include <bits/stdc++.h>
using namespace std;
int a[100010];
map<int,int>flag;//关键的一行
int ans[100010];
int main()
{
int n,m,x,i;
ios::sync_with_stdio(false);
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=m;i++)
{
cin>>x;
flag[x]=1;
}
int t=0;
for(i=1;i<=n;i++)
{
if(flag[a[i]]==1)
ans[++t]=a[i];
}
for(i=1;i<=t-1;i++)
printf("%d ",ans[i]);
printf("%d",ans[t]);//输出最后一个数时没有换行,换行会Presentation Error,当然,其他题一般都有换行
return 0;
}