STL 容器——队列 栈 vector set map list next_permutation

约瑟夫 酒桌 报数 等问题
运用队列可以将这些情况模拟。

#include <bits/stdc++.h>

using namespace std;

struct sp{
char name[50];
int k;
}s[100010];

queue<int>a;

int judge( int n){
if(n%7==0)
 return 1;
int k=n;
while(k>0){
    int s=k%10;
    if(s==7)
        return 1;
    k/=10;}
    return 2;
}
int main()
{
    int n,m,t;
    while(cin>>n>>m>>t){
        for(int i=1;i<=n;i++){
         cin>>s[i].name;
         s[i].k=i;
         a.push(i);
        }
        for(int i=0;i<m-1;i++){
            int y=a.front();
            a.pop();
            a.push(y);
        }
        while(a.size()!=1){
            int ans=judge(t);
            if(ans==2){
                int w=a.front();
                a.pop();
                a.push(w);
            }
            else
            a.pop();
            t++;
        }
        int q=a.front();
        printf("%s\n",s[q].name);}


    return 0;
}

用结构体队列好像更容易。
报数

#include <bits/stdc++.h>

using namespace std;
queue<int>a;
int main()
{
    int n,k;
    while(cin>>n>>k){
        for(int i=1;i<=n;i++)
            a.push(i);
        int num=1;
        while(a.size()!=1){
            if(num%k==0)
                a.pop();
            else{
                int x=a.front();
                a.pop();
                a.push(x);
                }
                num++;
            }
            int ans=a.front();
            cout<<ans<<endl;
    }
    

海港(提升题)

#include <bits/stdc++.h>

using namespace std;
const int N=1e5+1;

struct s{
int t,x;
};//用结构体绑定人和时间。

queue<s>vis;
int n,t,k,x,ans=0;
int num[N];
int main()
{
    struct s ac;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d",&t,&k);
        for(int j=1;j<=k;j++){
            scanf("%d",&x);
        vis.push({t,x});
        if(num[x]==0)
            ans++;//国家数。
        num[x]++;

    }
    while(t-vis.front().t>=86400){//判断符合条件的船。
        ac=vis.front();
        vis.pop();
        int y=ac.x;
        num[y]--;
        if(num[y]==0)
            ans--;
    }
    cout<<ans<<endl;
    }

    return 0;
}

更新一道刚做的
这一题看题头插入、删除准备用链表莽一发(虽然不会。。)
果然过不了
神奇的是,把链表换成vector+O2后过了。。。
在这里插入图片描述
上代码!!
洛谷 1160 队列安排

#include <bits/stdc++.h>

using namespace std;
vector<int>q;//用vector实现插入。
int n,k,p;
vector<int>::iterator it;
bool x[100010];//用于记录被删除的数,比调用erase函数更快。。
int main()
{
    q.push_back(1);//先将1输入。
    scanf("%d",&n);
    for(int i=2;i<=n;i++){
        scanf("%d %d",&k,&p);
        it=find(q.begin(),q.end(),k);//find函数可以返回k的位置。
        if(p){//右边。
                it++;//右边的话位置要向右移动一位。
            q.insert(it,i);}//插入函数是将数插入到位置前一位。
        else
            q.insert(it,i);
    }
    int m;
    scanf("%d",&m);
    for(int i=0;i<m;i++){
    scanf("%d",&n);
    x[n]=1;}//记录被删除的数。
    for(it=q.begin();it!=q.end();it++)//用迭代器实现输出。
        if(!x[*it])
        printf("%d ",*it);
    printf("\n");
    return 0;
}

再补充一个next_permutation也是c++stl里面的函数,用到全排列枚举比较多
洛谷 1706

#include <bits/stdc++.h>

using namespace std;

int main(){
int n;
cin>>n;
int a[10];
for(int i=0;i<n;i++)
    a[i]=i+1;
do{//避免少打了一种!
    for(int i=0;i<n;i++)
        printf("%5d",a[i]);
    printf("\n");
}while(next_permutation(a,a+n));

}

猜你喜欢

转载自blog.csdn.net/weixin_46127031/article/details/104296748