抽签问题改进算法

#if 0
       你的朋友提议玩一个游戏,将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中,如果这四个数字的和为m,
   就是你赢,否则就是你的朋友赢,你挑战了好几次,结果一次也没有赢,于是撕破口袋,取出所有的纸片,检查自己是否有赢的可能性。
       请编写一个程序,判断当纸片上写的数字是K1,K2,K3,...,Kn 时,是否村在抽取四次和为m的情况,如果存在,输出Yes,若不存在,输出No。
#endif

#include <stdio.h>
#include <stdlib.h>

int  Binary_search(int *Array ,int x,int n);
int  Solve(int *Array ,int n,int sum,int *BArray);
int  Partition_sort(int *Array,int low,int high);
int  QuickSort(int *Array,int low,int high);
void Initial_list(int *Array,int n,int *BArray);

void Initial_list(int *Array,int n,int *BArray)
{
     int k=0;
     int i=0;
     int j=0;

     for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
          BArray[k]=Array[i]+Array[j];
          k++;
        }
}

int Partition_sort(int *BArray,int low,int high)
{
    int location=*(BArray+low);

    while(low<high && *(BArray + high)>=location)
    {
        high--;
    }
    if(low<high)
    {
        *(BArray+low)=*(BArray+high);
    }

    while(low<high && *(BArray + high)<=location)
    {
        low++;
    }
    if(low<high)
    {
        *(BArray+high)=*(BArray+low);
        high--;
    }
    *(BArray+low)=location;
    return low;
}

int QuickSort(int *BArray,int low,int high)
{
    int base=0;
    if(low<high)
    {
        base=Partition_sort(BArray,low,high);
        QuickSort(BArray,low, base-1);
        QuickSort(BArray,base+1,high);
    }
    return 0;
}

int Binary_search(int *BArray,int x,int n)
{
     int mid=0;
     int begin=0;
     int end =n-1;
     int found=0;

     while(end-begin>=1)
     {
         mid=(begin + end )/2;
         if(x==*(BArray+mid))
            return found=1;
         else if(x>*(BArray+mid))
            begin=mid+1;
         else
            end=mid;
     }
     return found;
}

int Solve(int *Array ,int n,int sum,int *BArray)
{
    int i=0,j=0;
    int m=0;
    int flag=0;

    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            {
                m=*(Array+i)+*(Array+j);
                if(Binary_search(BArray,sum-m,n*n))
                {
                    flag=1;
                    break;
                }
            }
     return flag;
}

int main()
{
    int a[3]={1,3,5};
    int n=3;
    int sum=10;
    int b[9];

    Initial_list(a,n,b);
    QuickSort(b,0,n*n-1);
    if(1==Solve(a,n,sum,b))
        printf("Yes");
    else
        printf("No");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值