栈
PATA-1051 Pop Sequence
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1005;
int arr[maxn]; //保存给定的出栈序列
stack<int> st;
int main() {
int m,n,t;
scanf("%d%d%d",&m,&n,&t);
while(t--)
{
while(!st.empty()) st.pop(); //清空栈
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
int current=1; //指向出栈序列中的待出栈元素
bool flag = true;
for(int i=1;i<=n;i++)
{
st.push(i);
if(st.size()>m)
{
flag=false;
break;
}
while(!st.empty() && st.top()==arr[current])
{
st.pop();
current++;
}
}
//current=n+1
if(st.empty()==true && flag==true) printf("YES\n");
else printf("NO\n");
}
return 0;
}
队列
PATA-1056 Mice and Rice
#include <iostream>
#include <queue>
using namespace std;
const int maxn=1005;
struct mouse{
int w,rank;
}mouse[maxn];
queue<int> q;
int main() {
int np,ng,order;
scanf("%d%d",&np,&ng);
for(int i=0;i<np;i++){ //输入mouse的体重
scanf("%d",&mouse[i].w);
}
for(int i=0;i<np;i++){ //输入初始顺序
scanf("%d",&order);
q.push(order);
}
int temp=np,group; //temp为当前轮的比赛总老鼠数,group为组数
while(q.size()!=1){
if(temp%ng==0) group=temp/ng;
else group=temp/ng+1;
for(int i=0;i<group;i++){
int max=q.front();
for(int j=0;j<ng;j++){ //在一个组里循环
if(i*ng+j>=temp) break; //在最后一组老鼠数不足ng时起作用,退出循环
int front=q.front();
if(mouse[front].w>mouse[max].w) max=front;//找出质量最大的老鼠
mouse[front].rank=group+1;
q.pop(); //出队这只老鼠
}
q.push(max); //把胜利的老鼠晋级
}
temp=group; //group只老鼠晋级,因此下轮老鼠总数为group
}
mouse[q.front()].rank=1; //当队列中只剩下一只老鼠,排名第一
//输出所有老鼠信息
for(int i=0;i<np;i++){
printf("%d",mouse[i].rank);
if(i<np-1) printf(" ");
}
return 0;
}