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;
}