大一寒假训练七(队列)
报数-队列-约瑟夫环
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
cin>>n>>m;
queue<int>vis;
for(int i=1; i<=n; i++)
vis.push(i);
int num=0;
while(vis.size()>=2)
{
num++;
int x=vis.front();
vis.pop();
if(num%m==0)
;
else
vis.push(x);
}
int res=vis.front();
cout<<res;
return 0;
}
取牌游戏-队列-SET
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,p;
cin>>n>>k>>p;
int a[100050];
queue<int>vis;
for(int i=1; i<=k; i++)
vis.push(i);
int res;
int num=0,t=0;
while(!vis.empty())
{
res=vis.front();
vis.pop();
num++;
if(num%n==0)
{
a[t]=res;
t++;
}
if(!vis.empty())
{
for(int i=0;i<p;i++)
{
int x=vis.front();
vis.pop();
vis.push(x);
}
}
}
sort(a,a+k/n);
for(int i=0;i<k/n;i++)
cout<<a[i]<<endl;
return 0;
}
酒桌游戏-队列
#include <bits/stdc++.h>
using namespace std;
struct sa
{
string name;
} peo[10050];
int ju(int x)
{
if(x%7==0)
return 1;
while(x!=0)
{
if(x%10==7)
return 1;
x=x/10;
}
return 0;
}
int main()
{
int n,m,t;
cin>>n>>m>>t;
for(int i=1; i<=n; i++)
cin>>peo[i].name;
queue<int>vis;
for(int i=1; i<=n; i++)
vis.push(i);
int num=0;
while(num!=m-1)
{
num++;
int x=vis.front();
vis.pop();
vis.push(x);
}
int x=vis.front();
//cout<<peo[x].name<<endl;
//cout<<peo[num].name<<endl<<peo[m].name;
while(vis.size()>=2)
{
if(ju(t)==1)
vis.pop();
else
{
int mi=vis.front();
vis.pop();
vis.push(mi);
}
t++;
}
int i=vis.front();
cout<<peo[i].name;
return 0;
}
海港-队列
#include <bits/stdc++.h>
using namespace std;
struct pass
{
int t;
int c;
};
queue<pass>vis;
int a[1000000];//数组开小了会RE
int res;
int main()
{
int n;
cin>>n;
int t,k;
for(int i=0; i<n; i++)//每一次循环输出一个时间点的
{
cin>>t>>k;
int x;
for(int j=0; j<k; j++)
{
cin>>x;
vis.push({t,x});//结构体队列入列方式
if(a[x]==0)//桶排序的思想
res++;
a[x]++;
}
while(t-vis.front().t>=86400)//判断是不是24小时以内的
{
int p=vis.front().c;
vis.pop();
a[p]--;
if(a[p]==0)
res--;
}
cout<<res<<endl;
}
return 0;
}
周末舞会-队列
#include <bits/stdc++.h>
using namespace std;
int main()
{
queue<int>man;
queue<int>woman;
int m,n;
cin>>m>>n;
int k;
cin>>k;
for(int i=1; i<=m; i++)
man.push(i);
for(int i=1; i<=n; i++)
woman.push(i);
int res1,res2;
for(int i=0;i<k;i++)
{
res1=man.front();
man.pop();
res2=woman.front();
woman.pop();
cout<<res1<<" "<<res2<<endl;
man.push(res1);
woman.push(res2);
}
return 0;
}
Blash数集-队列-set
类似于丑数打表,类似于用几个数生成后面的数且按升序排列的题目都可以用此方法完成
#include <bits/stdc++.h>
using namespace std;
int x[100500];
int main()
{
int a,n;
cin>>a>>n;
int i1=1,i2=1;
x[1]=a;
for(int i=2; i<100010; i++)
{
x[i]=min(2*x[i1]+1,3*x[i2]+1);
if(x[i]==2*x[i1]+1)
i1++;
if(x[i]==3*x[i2]+1)
i2++;
}
cout<<x[n];
return 0;
}
关系网络-队列
BFS和队列结合使用
#include <bits/stdc++.h>
using namespace std;
int a[120][120];
struct sa
{
int s;
int r;
};
queue<sa>vis;
int main()
{
int n,x,y;
cin>>n>>x>>y;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>a[i][j];
vis.push({x,0});
int mark[120]= {0};
mark[x]=1;
while(!vis.empty())
{
int ss=vis.front().s;
int res=vis.front().r;
vis.pop();
if(ss==y)
{
cout<<res-1<<endl;
break;
}
for(int i=1; i<=n; i++)
{
if(a[ss][i]==1&&mark[i]==0)
{
mark[i]=1;
vis.push({i,res+1});
}
}
}
return 0;
}