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;
}
posted @ 2018-11-30 13:19  一无所知小白龙  阅读(134)  评论(0编辑  收藏  举报