目录
P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.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)