nefu 1678 查字典

#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;
}

nefu 1686 眼红的Medusa

这题注意数据范围,获得奖项的人的编号在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;
}