您的位置:首页 > 其它

抽签问题改进算法

2015-05-23 21:25 316 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: