标签:
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2240    Accepted Submission(s): 1361
比赛时候差一点就推出来了 自己比赛时太容易紧张了 尤其是跟队友一起时,唉 还是心态不行
题意:总共有2*k个人站成一个环,前k个人是好人,后k个人是坏人,现在要处决这2*k个人要求后k个坏人要在好人之前死,让找一个最小的m(按照圆圈数m个人第m个人处死,然后从这个处死的人的下一位为起点继续数m个以此类推,直至杀死所有人)使得坏人先死
题解:当前要处死的人为kill=(kill+m-1)%n (n为当前活着的人的数量)如果kill等于0 证明是要处死第n个人所以kill=n
我直接用函数求解超时了 ,因为数据不大 所以我直接吧14个数打表输出了
#include<stdio.h>
#include<string.h>
#include<cstdio> 
#include<string>
#include<math.h>
#include<algorithm>
#define LL long long
#define PI atan(1.0)*4
#define DD double
#define MAX 1100
#define mod 100
#define dian 1.000000011
#define INF 0x3f3f3f
using namespace std;
int f[20]; 
int s[20]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,13482720};
int fun(int k,int m)
{
	int kill,i,j,n;
	n=2*k;
	kill=1;
	for(i=1;i<=k;i++)
	{
		kill=(kill+m-1)%n;
		if(kill==0)
		    kill=n;
		else if(kill<=k)
		    return 0;
		n--;
	}
	return 1;
}
int main()
{
	int n,m,j,i,t,k;
	while(scanf("%d",&k),k)
	{
//		for(i=1;i<=14;i++)
//		{
//			for(j=1;;j++)
//			{
//				if(fun(i,j))
//				{
//					f[i]=j;
//					break;
//				}
//			}
//		}
		printf("%d\n",s[k]);
	}
	return 0;
}
标签:
原文地址:http://www.cnblogs.com/tonghao/p/5329895.html