C++中的vector,map,queue样题练习

 vector又名动态数组,可以理解为自动增大长度的一个数组,现在请你用vector来解决问题:

你现在是一个论坛的站长,你们论坛有10万个帖子,每个帖子编号为1-100000

每个帖子里面又有若干个回复.现在告诉你每个帖子下面的回复人的ID(ID的范围为1-100000)

现在你要写一个程序,支持插入操作,即ADD x y 代表编号为x的帖子有一个ID为y的人回复

支持查询操作,即QUERY x y 代表查询编号为x的帖子第y个回复的人的ID

输入

只有一组测试数据

第1行一个整数N,代表有N次询问(1<=N<=100000)

第2行到第N+1行代表N次询问的内容,每行为以下2种格式之一:

         ADD x y 新增加了一个回复,代表编号为x的帖子有一个ID为y的人回复

         QUERY x y 代表查询编号为x的帖子第y个回复的人的ID

保证1<=x<=100000,1<=y<=100000

输出

对于每个QUERY的查询,每次输出占一行,代表编号为x的帖子第y个回复的人的ID,如果编号为x的帖子总的回复数小于y,

则输出-1

样例输入

8
ADD 10 10086
ADD 10 10010
QUERY 10 1
QUERY 88888 1
ADD 88888 10010
ADD 88888 12580
QUERY 88888 2
QUERY 88888 3

样例输出

10086 
-1 
12580 
-1
#include<iostream>
#include<vector>
#include<cstring> 
#include<cstdio>
using namespace std;
vector<int> a[100010]; 
int main()
{
    int n,x,y,i;
    char b[6];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",b);
        if(b[0]=='A')
        {
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
        }
        if(b[0]=='Q')
        {
            scanf("%d%d",&x,&y);
            if(a[x].size()<y)
                printf("-1\n");
            else
                printf("%d\n",a[x][y-1]);
        }
    }
    return 0;
}

map是一个映射

例如map<string,int> a;可以将字符串映射为整数

map<double,int>a;可以将双精度浮点数映射为整数

那么现在请你用map解决问题

SW是课代表,老师判好卷子之后让他录成绩,他念了n个人的学号(学号是一个绝对值10^9以内的整数包括0,没有负数)

但是老师总觉得他念重复了。

还好老师用声控软件记录下了他念的每一个学号,现在请你写程序来判断SW有没有念过某个或者某些学号2次以上

如果有请你输出 1

否则输出 0

输入

只有1组测试数据

一个正整数n(1<=n<100000)代表SW念了学号的个数

之后第2行到第n+1行,每行一个10^9以内的整数(包括0没有负数),代表某个同学的学号

输出

输出一个整数,如果有重复的学号输出1

否则输出0

样例输入

4
11222222
0
1
11222222

样例输出

1
#include<iostream>
#include<map>
#include<cstring> 
#include<cstdio>
using namespace std;
map<int,int> m;
int main()
{
    int n,a;
    scanf("%d",&n);
    int ok = 0;
    while(n--)
    {
        scanf("%d",&a);
        if(m[a]==0)
            m[a] = 1;
        else
            ok = 1;
    }
    printf("%d",ok);
    return 0;
}

题目描述

课代表SW由于工作失误被扣了奖学金,所以他不得不去某家饭店打工,饭店很火爆,经常没有位置,所以不得不叫号。

他管理叫号软件,电脑系统是linux,某天他一不小心输入了“rm -rf  /”,他感觉他完蛋了, 正准备跑路,善良的你不忍心他丢工作你能帮他重新写一个叫号软件吗?

软件有三个指令

END为结束程序

PUSH NAME 为新来了一个名字叫做NAME的人排队,NAME的长度小于等于10

POP 为 如果有人在排队则输出当前队列中来的最早的人的名字并将其从队列里删除 否则 输出“EMPTY”(没有引号)

输入

只有一组测试数据

但是输入可能有若干行(保证不超过100000)

每行一个命令

PUSH NAME

POP

END

其中

END命令只会在最后一行出现,并且保证有END

输入END命令后立刻结束程序

输出

针对每个POP命令输出一行,如果有人在排队则输出当前队列中来的最早的人的名字并将其从队列里删除 否则 输出“EMPTY”(没有引号)

样例输入

PUSH LZX
PUSH CQW
POP
PUSH SW
POP
POP
POP
END

样例输出

LZX
CQW
SW
EMPTY
#include<iostream>
#include<queue>
#include<cstring> 
#include<cstdio>
using namespace std;
queue <string> q;
int main()
{
    char a[5],name[10];
    while(scanf("%s",a)!=EOF)
    {
        if(a[1]=='U')
        {
            scanf("%s",name);
            q.push(name);
        }
        if(a[1]=='O')
        {
            if(q.empty())
            {
                printf("EMPTY\n");
            }
            else
            {
                cout<<q.front()<<endl;
                q.pop();
            }
        }
        if(a[0]=='E')
        {
            return 0;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/haohaoxuexilmy/article/details/81174169