sbhz

题目描述

n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下猴子第二轮从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?

#include<bits/stdc++.h>
using namespace std;
int n,sum;
int a[1201],z[1201],y[1201];
int head,tail;
int s,t,w,q;//s起指针的作用,t是计数变量,w是s了几只猴子,q是应s的hz
bool f;
void init()
{
	cin>>n;
	sum=n;
	head=1;
	tail=n;
	for(int i=1;i<=n;i++)
	{
		int w,s;
		w=i-1;
		s=i+1;
		if(w==0) w=n;
		if(s==n+1) s=1;
		z[i]=w;
		y[i]=s;
	}
}
void hzsb()
{
	//统计还有几只猴子 
	s=head;//下一个猴子tmd我因为这个用出了静态查错大法!!!
	t=0;
	w=0;
	q=sum/3;//计数(3),判断删hz
	//头到尾
	while(q>w)//s了1/3的hz就结束 
	{
		s=y[s];
		t++;
		if(t==3)//可怜的第三只hzsb 
		{//shz

		    if(z[s]==tail)//尾被s了,换尾 
			tail=z[z[s]];//shz
			y[z[z[s]]]=s;
			z[s]=z[z[s]];
			sum--;
			t=0;
			w++;
		}
    }
    w=0;
    t=0;
    if(sum>=3) s=tail;
    q=sum/3;
	while(q>w&&sum>=3)
	{
		s=z[s];
		t++;
		if(t==3)
		{
		    
			if(s==tail)//换头 
			head=y[y[s]];//shz
			z[y[y[s]]]=s;
			y[s]=y[y[s]];
			w++;
			sum--;
			t=0;
		}
	}
	if(sum>=3) hzsb();//mss,jxs
	if(!f) {cout<<z[s];f=1;}
}
int main()
{
	init();
	hzsb();
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值