PAT 甲级 1048 Find Coins (c语言实现)

来看看题目

这个题我的理解是 将这n个数先排序

再对排好序的n个数进行循环算出两两之和

若满足两数v1+v2=m&&v1<v2则输出 且只输出满足这个条件的第一组数据(这个用flag控制)

否则输出No solution

但是这道题并没有AC 出现了段错误

#include <stdio.h>
#include <stdlib.h>
int a[101],b[101],c[101],n,m;
void quicksort(int left,int right);
int main()
{
    int i,j,t;
    int flag1=100000;
    int flag2=-1;
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    quicksort(1,n); //快速排序调用

    for(i=1;i<=n;i++)
	{
	    for(j=i+1;j<=n;j++)
        {
            if((a[i]+a[j]==m)&&(a[i]<=a[j]))
            {
                if(flag1>a[i]){
                    flag1=a[i];flag2=a[j];
                }

            }

        }

	}

               if(flag2!=-1) printf("%d %d",flag1,flag2);
	else printf("No Solution");

}
void quicksort(int left,int right)
{
    int i,j,t,temp;
    if(left>right)
       return;

    temp=a[left]; //temp中存的就是基准数
    i=left;
    j=right;
    while(i!=j)
    {
        //先从右边开始找
        while(a[j]>=temp && i<j)
        {
        	j--;
		}
        //再找左边的
        while(a[i]<=temp && i<j)
		{
			i++;
		}
        //交换两个数在数组中的位置
        if(i<j)
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    //最终将基准数归位
    a[left]=a[i];
    a[i]=temp;

    quicksort(left,i-1);//递归处理左边
    quicksort(i+1,right);//递归处理右边
}

猜你喜欢

转载自blog.csdn.net/zouzou_/article/details/86498821