ZJU 09 複試上機 第四題

第四題:尋找大富翁;輸入n0<n<=100000),m(0<m<=10)n爲小鎮上的人數,m爲需要找出的大富翁數。輸入:

n, m 接下來一行輸入小鎮n個人的財富值,輸出:前m個大富翁的財產數,n0時結束

 

 

 

這道題 看到時有點蠻驚訝的,或許是記憶版改變了題目。我理解錯了,第四道不至於還送分 1、2、4加起來20分鐘可以搞定 未免有點,何況我的編程水品還是個超級菜鳥

 

 

#include <iostream>
#include <algorithm>
using namespace std;

int num[100000];
int cmp(int x,int y)
{
 return x>y;
}
int main()
{
 int n,m;
 while(cin>>n>>m&&n)
 {
  int i;
  for(i=0;i<n;i++)
   cin>>num[i];

  sort(num,num+n,cmp);
  for(i=0;i<m;i++)
   cout<<num[i]<<" ";
  cout<<endl;
 }
 return 0;
}

 

 

 

 

 

萬一到時不讓用sort 這裏還是留一個快速排序的模板,要熟悉至少一個自定義版本,已被不時之需

語法:quicksort(int l,int r,int b[]);

參數:

l:

排序上界,開始時l=0

r:

排序下界,開始時r=數組元素個數

b[]:

被排序的元素

返回值:

null

注意:

 

 

輸出升序序列

源程序:

 

 

void quicksort(int l,int r,int b[])
{
    
int i,j,x;
    
if(l>=r) return;
    i=l;
    j=r;
    x=b[i];
    
while(i!=j)
        {
        
while(b[j]>x&&j>i) j--;
        
if(i<j)
            {
            b[i]=b[j];
            i++;
            }
        
while(b[i]<x&&j>i)i++;
            
if(i<j)
                {
                b[j]=b[i];
                j--;
                }
        }
    b[i]=x;
    quicksort(l,j-1,b);
    quicksort(i+1,r,b);
}

 

 

 

暈啦,果然不出所料,題目不可能這麼直白,10*100000=1000000;這是使用選擇排序的代價,以後要有這個概念,這個能一百萬的運算次數能夠提交   而直接使用sort的代價是

log(100000)*100000是前者的好幾倍,上機時是不能AC的

更節約時間和內存的方法是邊輸入邊篩選的算法,先用前十個數字輸入並排序,然後後續每一個輸入都先和這10個元素的最小值進行比較,如果小的話不用操作,大的話就替換 並重新排序,一趟冒泡排序就夠,要掌握技巧(當然性能最高的還是建一個堆,堆篩選重新恢復有序的代價小很多,實現起來麻煩一點,考試的時候還是按照數據的規模自己把握),

 

這裏瞭解vector 的partial_sort好辦很多,這裏給出模板

partial_sort(vector.begin(),vector.begin()+require,vector.end(),cmp)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章