考虑了几天了,受到上一个高人算法的启发我想到了这样一个算法:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Game(int N,long K)
{
long max,LE;
int p,LP;
if( N<=0 ‖ N>500 ‖ K<0 ‖ K>N*(N-1)/2 )
return 0;
if( K==0 ‖ K==N-1)
return 1;
if( N==1 ‖ K<N-1 )
return 0;
max=N*(N-1)/2;
while (1)
{
p=(int) sqrt((max-K)*2);
LP=N-p;
if (LP<0) return 0;
if (p==1 && LP>=2) return 1;
LE=max-p*(p-1)/2;
if (LE==K) return 1;
if (LE<K) return 0;
max=LE;
N=LP;
}
}
int main()
{
long K;
int N,Result;
printf("Please input N,K:");
scanf("%d,%d",&N,&K);
Result=Game(N,K);
if (Result) printf("YES");
else printf("NO");
return 1;
}
其算法原理还是基于前两天算法的研究.这个算法纯粹的使用循环而没有使用递归,但是算法复杂度我现在还不得而知(怎么算得啊?忘记了 呵呵~~).另外也不知道算法的正确性是否成立(没有测试数据),仅仅是我感觉上可行.呵呵 再研究~~.另外这个Beta还有可以改进之处.慢慢来吧~~
没有评论:
发表评论