2007年3月20日星期二

变态比赛规则之初步程序

考虑了几天了,受到上一个高人算法的启发我想到了这样一个算法:


#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还有可以改进之处.慢慢来吧~~

没有评论: