| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:终于不打表AC,282ms,放出代码,求更快的解法……In Reply To:终于不打表AC,282ms,放出代码,求更快的解法…… Posted by:alexneko at 2008-07-12 16:14:45 47MS, 关键在于要考虑最后剩下k+1个时,这时起始点可能是待删除的那个或者是第一个,那样的话可能是答案的数只可能是t*(k+1)或者(k+2)+(t-1)*(k+1),这里也要谢谢楼主,如果不是楼主,我还不会用(start+m-1)%N+1这个公式来确定点的位置呢,下面是代码,仅供参考。
// 1012_Joseph.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include <memory.h>
const int max = 15;
int number[ max ];
int main()
{
memset( number, 0 , sizeof(int)*max );
int N = 0;
while ( true )
{
scanf("%d", &N );
if ( N == 0 )
{
break;
}
if ( number[ N ] != 0 )
{
printf("%d\n", number[N] );
continue;
}
int i = 0;
int a = N+1;
int b = N+2;
int aTemp = a;
int bTemp = b;
while ( true )
{
int total = 2*N;
int start= 0;
for ( i = 0; i < N; ++i )
{
start = (start+aTemp-1)%total+1;
if ( start <= N )
{
break;
}
--start;
--total;
}
if ( total == N)
{
printf("%d\n", aTemp );
number[ N ] = aTemp;
break;
}
else
{
aTemp += (N+1);
}
total = 2*N;
start= 0;
for ( i = 0; i < N; ++i )
{
start = (start+bTemp-1)%total+1;
if ( start <= N )
{
break;
}
--start;
--total;
}
if ( total == N )
{
printf("%d\n", bTemp );
number[ N ] = bTemp;
break;
}
else
{
bTemp += (N+1);
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator