大一寒假训练(七)

本次训练共五题,本文附题目链接及题解

借鉴二位博主 (抱拳)
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;
}

你可能感兴趣的:(queue)