本次训练共五题,本文附题目链接及题解
借鉴二位博主 (抱拳)
nefu_ljw link.
nefu-wmjlink.
Problem A 周末舞会-队列 link.
#include
using namespace std;
queue<int>vis1,vis2;
int main()
{
int n,m,k,s1,s2,i;
cin>>m>>n>>k;
for(i=1; i<=m; i++)
vis1.push(i);
for(i=1; i<=n; i++)
vis2.push(i);
for(i=1; i<=k; i++)
{
s1=vis1.front(); vis1.pop();
s2=vis2.front(); vis2.pop();
cout<<s1<<" "<<s2<<endl;
vis1.push(s1);
vis2.push(s2);
}
return 0;
}
Problem B 取牌游戏-队列-SET link.
#include
using namespace std;
queue<int>vis;
int main()
{
int i,n,k,p,a[100001];
int num=0,mark=0;
cin>>n>>k>>p;
for(i=1; i<=k; i++)
vis.push(i);
while(!vis.empty())
{
int m=vis.front();
vis.pop();
num++;
if(num%n==0) a[mark++]=m;
if(!vis.empty())
for(i=1; i<=p; i++)
{
int cnt=vis.front();
vis.pop();
vis.push(cnt);
}
}
sort(a,a+k/n);
for(i=0; i<k/n; i++)
cout<<a[i]<<endl;
return 0;
}
Problem C 报数-队列-约瑟夫环 link.
#include
using namespace std;
queue<int>vis;
int main()
{
int i,n,m,mark,p;
cin>>n>>m;
for(i=1; i<=n; i++)
vis.push(i);
mark=0;
while(vis.size()>1)
{
mark++;
p=vis.front();
vis.pop();
if(mark%m!=0) vis.push(p);
}
printf("%d\n",vis.front());
return 0;
}
Problem D 酒桌游戏-队列 link.
①运用结构体处理
②编写判断函数
#include
using namespace std;
struct beer
{
int n;
char name[50];
}p[10001];
bool judge(int x)
{
if(x%7==0) return 0;
while(x)
{
if(x%10==7) return 0;
x=x/10;
}
return 1;
}
queue<struct beer>vis;
int main()
{
int n,m,t,i;
cin>>n>>m>>t;
for(i=1;i<=n;i++)
{
cin>>p[i].name;
p[i].n=i;
}
for(i=1;i<=n;i++)
vis.push(p[i]);
for(i=1;i<=m-1;i++)
{
vis.push(p[i]);
vis.pop();
}
while(vis.size()>1)
{
struct beer cnt=vis.front();
vis.pop();
if(judge(t)) vis.push(cnt);
t++;
}
cout<<vis.front().name<<endl;
return 0;
}
Problem E 库特的素数队列(1) link.
素数筛与队列的结合
#include
using namespace std;
const int N=1e7+1;
int prime[N];
int b[N];
int cnt=0,max1=1e7;
//埃及筛
bool init()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2;i<=max1;i++)
{
if(b[i])
{
prime[++cnt]=i;
for(int j=2;j*i<=max1;j++)
b[i*j]=0;
}
}
}
//线性筛
bool init()
{
memset(b,1,sizeof(b));
b[0]=b[1]=0;
for(int i=2; i<=max1; i++)
{
if(b[i])
prime[++cnt]=i;
for(int j=1; j<=cnt && prime[j]*i<=max1; j++)
{
b[prime[j]*i]=0;
if(i%prime[j]==0) break;
}
}
}
queue<int>vis;
int main()
{
init();
int t,n,i;
cin>>t;
while(t--)
{
cin>>n;
for(i=1; i<=n; i++)
vis.push(i);
while(vis.size()>1)
{
int m=vis.size();
for(i=1; i<=m; i++)
{
int cnt=vis.front();
vis.pop();
if(b[i]) vis.push(cnt);
}
}
cout<<vis.front()<<endl;
vis.pop();//清空队列
}
return 0;
}