A:
题意:先给你规则(FIFO表示先进先出,FILO表示先进后出),然后给你n种操作,入队或出队,出队的时候输出出队的值。
直接用queue和stack模拟即可。
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
int n,x,ans;
char a[10],b[10];
queue<int> q;
stack<int> s;
void init()
{
while(!q.empty())
q.pop();
while(!s.empty())
s.pop();
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
init();
scanf("%d%s",&n,a);
if(a[2]=='F')
{
for(int i=1;i<=n;i++)
{
scanf("%s",b);
if(b[0]=='I')
{
scanf("%d",&x);
q.push(x);
}
else
{
if(q.size()==0)
{printf("None\n");continue;}
ans=q.front();
printf("%d\n",ans);
q.pop();
}
}
}
else
{
for(int i=1;i<=n;i++)
{
scanf("%s",b);
if(b[0]=='I')
{
scanf("%d",&x);
s.push(x);
}
else
{
if(s.size()==0)
{printf("None\n");continue;}
ans=s.top();
printf("%d\n",ans);
s.pop();
}
}
}
}
return 0;
}
B:
题意:给你n,然后是长度为n的两个序列O1和O2,问O1序列能否经过特定地入栈出栈顺序转为O2。
用栈模拟即可。
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<<endl<<endl<<endl
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=100010;
using namespace std;
int n;
char s1[100010],s2[100010];
int a[100010],b[100010];
stack<int> s;
int ans[100010];
int main()
{
while(scanf("%d",&n)!=EOF)
{
while(!s.empty())
s.pop();
scanf("%s%s",s1+1,s2+1);
for(int i=1;i<=n;i++)
a[i]=s1[i]-'0';
for(int i=1;i<=n;i++)
b[i]=s2[i]-'0';
int p1=2,p2=1,cnt=0;
int f=0;
ans[++cnt]=1;
s.push(a[1]);
while(1)
{
if(s.size()==0&&p1>n)
{f=1;break;}
if(p1>n&&s.top()!=b[p2])
break;
if(s.size()==0)
ans[++cnt]=1,s.push(a[p1]),p1++;
if(s.top()==b[p2])
ans[++cnt]=2,s.pop(),p2++;
else
ans[++cnt]=1,s.push(a[p1]),p1++;
}
if(f==0)
printf("No.\nFINISH\n");
else
{
printf("Yes.\n");
for(int i=1;i<=cnt;i++)
{
if(ans[i]==1)
printf("in\n");
else
printf("out\n");
}
printf("FINISH\n");
}
}
return 0;
}
C:
题意:有一种传染病,默认一个团体内有一个患病者就全部认为患病,0号默认患病,问有多少患病人员。
多组输入,每组输入的第一行是两个数 n 和 m ,表示有 n 个人(编号从 0 开始),m 表示有 m 个团体,接下来有 m 行,每行的都一个数为 cnt ,然后接下来有 cnt 个数,表示这个团体里的成员编号。问有多少个患病的人。
并查集模板题。
有关并查集的讲解可以看一下这篇博客:https://blog.youkuaiyun.com/liujian20150808/article/details/50848646
下面是这道题的代码:16ms
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int fa[30010];
void init()
{
for(int i=0;i<=n;i++)
fa[i]=i;
}
int findfa(int x)
{
if(fa[x]==x)
return fa[x];
return fa[x]=findfa(fa[x]);
}
void Union(int x,int y)
{
int xx=findfa(x),yy=findfa(y);
if(xx!=yy)
fa[xx]=yy;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
init();
int cnt,x,y;
for(int i=1;i<=m;i++)
{
scanf("%d",&cnt);
if(cnt==0)
continue;
scanf("%d",&x);
cnt--;
while(cnt--)
{
scanf("%d",&y);
Union(x,y);
}
}
int ans=1;
for(int i=1;i<=n;i++)
{
if(findfa(i)==findfa(0))
ans++;
}
printf("%d\n",ans);
}
return 0;
}
本文通过三道编程题目,详细介绍了如何使用队列和栈解决实际问题,包括模拟不同数据处理流程、检查序列转换可能性以及利用并查集进行群体感染状态判断。
514

被折叠的 条评论
为什么被折叠?



