2024/1/29 备战蓝桥杯 2(队列+数组)

目录

约瑟夫问题

P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

餐厅排队

0餐厅排队 - 蓝桥云课 (lanqiao.cn)

小桥的神秘礼盒

0小桥的神秘礼物盒 - 蓝桥云课 (lanqiao.cn)

机器翻译

0机器翻译 - 蓝桥云课 (lanqiao.cn)


约瑟夫问题

P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:模拟+stl的队列

在循环的时候 先把队头放进队尾,再把队头pop掉

循环到需要输出的时候就直接输出,然后pop掉队头

完整代码:

#include <bits/stdc++.h>
#define int long long
signed main()
{
    std::queue<int> q;
    int n,m;
    std::cin >> n >> m;
    for(int i = 1;i <= n;i ++)
    {
        q.push(i);
    }
    while(!q.empty())
    {
        for(int i = 1;i< m;i ++)
        {
            q.push(q.front());
            q.pop();
        }
        std::cout<<q.front()<<" ";
        q.pop();
    }
    return 0;
}

餐厅排队

0餐厅排队 - 蓝桥云课 (lanqiao.cn)

思路:模拟+stl的queue

关于队列的一些操作:

q.push(x) :把x放入队列中

q.pop() :弹出队头元素

q.front():取出队头元素

q.empty():判断队列是否为空(队列不空:while(!q.empty())    )

q.back() :返回队尾元素

q.size() :返回队列的元素个数

完整代码:

#include <bits/stdc++.h>
#define int long long
signed main()
{
    int t;
    std::cin >> t;
    std::queue<int> q;
    while(t --)
    {
        int n;
        std::cin >> n;
        if(n==1)
        {
            int x;
            std::cin >> x;
            q.push(x);
        }
        else if(n==2)
        {
            q.pop();
        }
        else if(n==3)
        {
            std::cout<<q.front()<<" "<<q.back();
            std::cout<<"\n";
        }
    }
    return 0;
}

小桥的神秘礼盒

0小桥的神秘礼物盒 - 蓝桥云课 (lanqiao.cn)

思路:模拟+stl的queue

完整代码:

#include <bits/stdc++.h>
#define int long long
signed main() {
    int t;
    std::cin >> t;
    std::queue<int> q;
    while (t--) {
        int n;
        std::cin >> n;
        if (n == 1) {
            int x;
            std::cin >> x;
            q.push(x);
        } else if (n == 2) {
            if (q.empty()) {
                std::cout << "lan\n";
            } else {
                q.pop();
            }
        } else if (n == 3) {
            if (q.empty()) {
                std::cout << "qiao\n";
            } else {
                std::cout << q.front() << "\n";
            }
        } else if (n == 4) {
            std::cout << q.size() << "\n";
        }
    }
    return 0;
}

机器翻译

0机器翻译 - 蓝桥云课 (lanqiao.cn)

思路:模拟+stl的queue

分三种情况:

(1) 字典里没有且内存足够

          此时英文单词直接进队列,内存容量减一,查询量+1

(2)字典里没有且内存不足

          此时英文单词进队列,队列中弹出队首元素,查询量+1

(3)字典中有英文单词

         此时不需要任何操作,continue

记录字典中是否有这个英文单词可以再开一个bool数组标记一下,如果单词存在,vis[a[i]]=true;如果单词不存在,则vis[a[i]]=false

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 10086;
int a[N];
bool vis[N];
int ans = 0;
signed main() {
    int m, n;
    std::cin >> m >> n;
    std::queue<int> q;
    while (!q.empty()) {
        q.pop();
    }
    memset(vis, false, sizeof(vis));
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        if (vis[a[i]] == false && q.size() < m) {
            vis[a[i]] = true;
            q.push(a[i]);
            ans++;
        }
        if (vis[a[i]] == false && q.size() == m) {
            q.push(a[i]);
            vis[a[i]] = true;
            vis[q.front()] = false;
            q.pop();
            ans++;
        }
        if (vis[a[i]] == true) {
            continue;
        }
    }
    std::cout << ans;
    return 0;
}

关于机器翻译的另一个思路(set):

假设要删x

auto it =s.find(x);

s.erase(it)

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值