每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下

// test20.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<string.h>
#include<deque>
#include <forward_list>

using namespace std;


class Solution {
public:
	int LastRemaining_Solution(unsigned int n, unsigned int m)
	{
		//双向队列里面,删除比较方便
		if (n == 0||m==0) return -1;

		vector<unsigned int> vec; //存储正在操作的数组
		vector<unsigned int> copy; //存储临时拷贝的数组
		for (unsigned int i = 0;i < n;i++)
			vec.push_back(i);
	 //	copy = vec;
	
		while (vec.size()!=1)
		{
			int len = vec.size();
			int flag = m%len;//如果没有余数,删除最后一个数;有余数,删除余数减1的数
			if (flag == 0)
			{
				for (int i = 0;i <len -1;++i)
				{
					copy.push_back(vec[i]);
				}
				vec.clear();
				vec = copy;
				copy.clear();
			}
			else
			{
				for (int i = flag;i <len ;++i)
				{
					copy.push_back(vec[i]);
				}
				for (int i = 0;i < flag - 1;++i)
				{
					copy.push_back(vec[i]);
				}
				vec.clear();
				vec = copy;
				copy.clear();
			}			   
		}
		cout << "vec[0]:" << vec[0] << endl;
		return vec[0];
	}
};
int main()
{
	
	Solution so;
//	vector<int> numbers = { 1,2,3,4,5 };
 /*   bool result=so.IsContinuous(numbers);
	cout <<"result:"<< result << endl;*/

	int result = so.LastRemaining_Solution(5,3);
	cout << "result:" << result << endl;

	cout << endl;
	return 0;
}
posted @ 2016-11-04 16:34  wdan2016  阅读(1403)  评论(0编辑  收藏  举报