第四題:尋找大富翁;輸入n(0<n<=100000),m(0<m<=10),n爲小鎮上的人數,m爲需要找出的大富翁數。輸入:
n, m 接下來一行輸入小鎮n個人的財富值,輸出:前m個大富翁的財產數,n爲0時結束
這道題 看到時有點蠻驚訝的,或許是記憶版改變了題目。我理解錯了,第四道不至於還送分 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[])
暈啦,果然不出所料,題目不可能這麼直白,10*100000=1000000;這是使用選擇排序的代價,以後要有這個概念,這個能一百萬的運算次數能夠提交 而直接使用sort的代價是 log(100000)*100000是前者的好幾倍,上機時是不能AC的 更節約時間和內存的方法是邊輸入邊篩選的算法,先用前十個數字輸入並排序,然後後續每一個輸入都先和這10個元素的最小值進行比較,如果小的話不用操作,大的話就替換 並重新排序,一趟冒泡排序就夠,要掌握技巧(當然性能最高的還是建一個堆,堆篩選重新恢復有序的代價小很多,實現起來麻煩一點,考試的時候還是按照數據的規模自己把握),
這裏瞭解vector 的partial_sort好辦很多,這裏給出模板 partial_sort(vector.begin(),vector.begin()+require,vector.end(),cmp)
|