无法吃午餐的学生数量
时间限制: 1s
类别: DS:队列->队列的应用
晚于 2024-05-26 23:59:00 后提交分数乘系数50%
截止日期:2024-05-30 23:59:00
问题描述
学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。
餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮:
如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这名学生会 放弃这个三明治 并回到队列的尾部。
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。
给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。
示例 1:
输入:students = [1,1,0,0], sandwiches = [0,1,0,1]
输出:0
解释:
- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [1,0,0,1]。
- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [0,0,1,1]。
- 最前面的学生拿走最顶上的三明治,剩余学生队列为 students = [0,1,1],三明治栈为 sandwiches = [1,0,1]。
- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [1,1,0]。
- 最前面的学生拿走最顶上的三明治,剩余学生队列为 students = [1,0],三明治栈为 sandwiches = [0,1]。
- 最前面的学生放弃最顶上的三明治,并回到队列的末尾,学生队列变为 students = [0,1]。
- 最前面的学生拿走最顶上的三明治,剩余学生队列为 students = [1],三明治栈为 sandwiches = [1]。
- 最前面的学生拿走最顶上的三明治,剩余学生队列为 students = [],三明治栈为 sandwiches = []。
所以所有学生都有三明治吃。
示例 2:输入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
输出:3
输入说明
输入3行
第一行输入一个整数n表示长度
第二行输入n个0或1表示students的元素
第三行输入n个0或1表示sandwiches的元素
1 <= n <= 100
sandwiches[i] 要么是 0 ,要么是 1 。
students[i] 要么是 0 ,要么是 1 。
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int WithoutLunch(stack<int>&s,queue<int>&q,int n)
{
int count = 0;
while (!s.empty())
{
if (q.front() == s.top())
{
// 如果学生喜欢栈顶的三明治,则拿取它
q.pop();
s.pop();
count = 0; // 重置无法吃午餐的学生数量
}
else
{
// 如果学生不喜欢栈顶的三明治,则放弃并回到队列尾部
q.push(q.front());
q.pop();
++count; // 无法吃午餐的学生数量加1
}
// 如果队列中的学生都无法吃午餐,则退出循环
if (count == q.size())
{
break;
}
}
return s.size(); // 返回无法吃午餐的学生数量
}
int main()
{
int n,sandwitch,student;
stack<int> sand;
queue<int> stu;
cin>>n;
for(int i=0; i<n; ++i)
{
cin>>student;
stu.push(student);
}
for(int i=0; i<n; ++i)
{
cin>>sandwitch;
sand.push(sandwitch);
}
cout<<WithoutLunch(sand,stu,n)<<endl;
return 0;
}