2.3幸运儿

题目

题意:就是有一堆人,每个人有编号,进行q次操作,删除人,每第b个人就删去,输出剩下的人数,并输出他们的编号

两种做法,一种是用vector,从后面开始删除,从(m/b)*b个人一直到第b个人,还有一种就是暴力跑,因为只有5000,也就n平方可以过

第一种

#include<stdio.h>
#include<iostream>
using namespace std; 
#include<algorithm>
#include<vector>
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(a,b) scanf("%d%d",&a,&b)
#define pf printf
#define prf(x) printf("%d\n",x)
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
vector<int>v;
int main()
{
    int n,m,x;
    scff(n,m);
    rep(i,0,n)
    {
        scf(x);
        v.push_back(x);
    }
    rep(i,0,m)
    {
        scf(x);
        int num=v.size()/x; //总共要删除的人数
        per(i,num,1)
        {
            v.erase(v.begin()+i*x-1); //删除第i*x人
        }
    }
    prf(v.size()); 
    rep(i,0,v.size()-1)
        pf("%d ",v[i]);
    prf(v[v.size()-1]);
    return 0;
}

第二种

#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std; 
#include<algorithm>
#include<vector>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define mm(a,b) memset((a),(b),sizeof(a))
#define per(i,a,n) for (int i=a;i>=n;i--)
int a[5007];
int cunzai[5007];
int main()
{
    int n,q;cin>>n>>q;
    mm(cunzai,1);
    rep(i,1,n+1)
        cin>>a[i];
    int tot=n;
    while(q--)
    {
        int x;cin>>x;
        int num=0;
        rep(i,1,n+1)
        {
            if(cunzai[i])
            {
                num++;
                if(num%x==0)
                    cunzai[i]=0,num=0,tot--;
            }
        }
    }
    cout<<tot<<endl;
    rep(i,1,n+1)
    {
        if(cunzai[i])
        {
            if(tot==1)
            {
                cout<<a[i];break;
            }
            else
            {
                cout<<a[i]<<" ";
                tot--;
            }
        }
     } 
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wzl19981116/p/10043582.html
2.3