关于快速排序,因为MixingMilk了解了快速排序

来源:互联网 发布:得力33068 软件下载 编辑:程序博客网 时间:2024/05/09 09:41

昨天做的MixingMilk这道ACM题很头疼,想尽了一切本人力所能及之内觉得更快的方法,但最后还是以失败告终。Time Limit Exceed总是这样的结果,哭死了要。

早上起来仍然不甘心,看了一下贪心算法,觉得自己已经做到了,想想是不是因为自己的排序效率低呢?其实自我感觉排序的效率还算挺快了,之后看到了一篇相关文章,用的是快速排序,于是学习了一下,觉得效果很好。关于快速排序,在这里简单说明一下

看下面的这个应该能看懂快速排序的基本思想和解题方法

 

http://http://baike.baidu.com/view/115472.htm

 

然后对于本题的作法可以参考本人写的

 

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

typedef struct farmer
{
     int price;
     int amount;
}farmer;

void QuickSort(farmer *array,int left,int right)
{
     int i,j,k,l;
     i=left;
     j=right;
     k=array[left].price;
     l=array[left].amount;
     while(i<j)    
     {
          while(i<j&&k<array[j].price)
              j--;
          if(i<j)
          {
              array[i]=array[j];
              i++;            
          }
          while(i<j&&k>array[i].price)
              i++;
          if(i<j)
          {
              array[j]=array[i];
              j--;      
          }
     }
     array[i].price=k;
     array[i].amount=l;                                     //这里大家一定要注意,前面的排序是覆盖式的,并不是交换,所以在最后要把第一个被覆盖的数,也就是最初的array[i]的值赋回去。
     if(left<i)
         QuickSort(array,left,i-1);
     if(i<right)
         QuickSort(array,i+1,right);
}

int main()
{
    farmer fr[5000];
    int n,m,i,money=0;
    while(1)
    {
        scanf("%d",&n);
        scanf("%d",&m);
        for(i=0;i<m;i++)
             scanf("%d %d",&fr[i].price,&fr[i].amount);
        QuickSort(fr,0,m-1);
        i=0;
        while(n)
        {
             if(n>=fr[i].amount)
             {
                 money+=fr[i].price*fr[i].amount;
                 n-=fr[i].amount;      
             }       
             else
             {
                 money+=fr[i].price*n;
                 n=0;
             }
             i++;
        }
        printf("%d\n",money);
    }
    system("pause");
    return 0;
}


 这道题的相关代码几乎一样,我也是在彻底理解的基础上写出来的,希望对相关问题有兴趣的朋友有帮助。

最后想说的是即便是这样,最后提交上去居然也超时,神啊!!救救我吧!!!

原创粉丝点击