今天真的是累哭了,周一課從早八點半一直上到晚九點半,整個人要虛脫的感覺,因為時間不太夠鴨所以就回頭看看找了一些比較有知識點的題來總結總結分析一下,明天有空了就開始繼續打題,嘻嘻嘻。 今日興趣電影: 《超能查派》 這是一部關於未來人工智慧的一個故事,感覺特別有思維開拓性,一個程式員寫出了真正的AI智能 ...
今天真的是累哭了,周一課從早八點半一直上到晚九點半,整個人要虛脫的感覺,因為時間不太夠鴨所以就回頭看看找了一些比較有知識點的題來總結總結分析一下,明天有空了就開始繼續打題,嘻嘻嘻。
今日興趣電影:
《超能查派》
這是一部關於未來人工智慧的一個故事,感覺特別有思維開拓性,一個程式員寫出了真正的AI智能機器人,可以從嬰兒開始學習,然後以極快極強的學習速度不斷成長,最後拯救身邊人的故事。很感人,強烈推薦哈哈~
愛奇藝:https://www.iqiyi.com/v_19rroly1wo.html?flashvars=videoIsFromQidan%3Ditemviewclkrec#vfrm=5-7-0-1
------------------------------------------------題目----------------------------------------------------------
Sort
Problem Description
給你n個整數,請按從大到小的順序輸出其中前m大的數。Input
每組測試數據有兩行,第一行有兩個數n,m(0<n,m<1000000),第二行包含n個各不相同,且都處於區間[-500000,500000]的整數。Output
對每組測試數據按從大到小的順序輸出前m大的數。Sample Input
5 3 3 -35 92 213 -644
Sample Output
213 92 3
------------------------------------------------題目----------------------------------------------------------
(一) 題目分析:
題目其實很簡單,直接使用sort函數就可以了,沒有太多的想法,特別地方就是對sort的排序規則進行自定義而已。這題沒必要用什麼冒泡啊快排了,只是鞏固sort的用法,而今天這篇文章就對sort函數進行研究。
(二)代碼分塊:
第一步:先規定sort的排序規則:
bool cmp(long long int a,long long int b){ return a>b; }
第二步:使用sort排序再輸出即可:
sort(num,num+N,cmp); for(i = 0;i<M;i++) { if(i<M-1) printf("%lld ",num[i]); else{ printf("%lld\n",num[i]); break; } }
(三)AC代碼:
#include<stdio.h> #include <algorithm> using namespace std; long long int num[1000005]; long long int N,M,i; bool cmp(long long int a,long long int b){ return a>b; } int main() { while(~scanf("%lld%lld",&N,&M)) { for(i = 0;i<N;i++) scanf("%lld",&num[i]); sort(num,num+N,cmp); for(i = 0;i<M;i++) { if(i<M-1) printf("%lld ",num[i]); else{ printf("%lld\n",num[i]); break; } } } return 0; }
(四)AC截圖:
(五)解後分析:
這裡想要總結一下sort一些特殊用法,所以就把sort完完整整的說一遍吧~當作對自己的複習嘻嘻嘻。
A、sort:
#include <algorithm> template< class RandomIt > void sort( RandomIt first, RandomIt last ); template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp );
時間複雜度:n*log10(n)
實現原理:除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。
(參考:http://www.cnblogs.com/fengcc/p/5256337.html)
函數原型:sort(first_pointer,first_pointer+n,cmp)
註意:當cmp不寫時,預設是升序排序。
B、自定義cmp比較函數的使用方法:
(1)數組排序自定義:
在本題中,就使用了數組排序的自定義化,核心代碼:
int A[1000]; bool cmp(int a,int b)//int為數組數據類型 { return a>b;//降序排列 } sort(A,A+1000,cmp);
(2)結構排序自定義:
這個自定義也是經常遇到的,因為經常要做線性表的一個插入刪除排序查找工作,核心代碼:
Student stu[1000]; bool cmp(Student a,Student b) { return a.id>b.id;//按照學號降序排列 } sort(Stu,Stu+1000,cmp);
核心就在return處進行細微的修改處理啦~同理應該能夠用到類了~
C、重載結構體或類的比較運算符:
(1)直接在結構體里進行重載比較運算符:
typedef struct Student{ int id; string name; double grade; bool operator<(const Student& s) { return id>s.id;//降序排列 } }; vector<Student> V; sort(V.begin(),V.end());
這裡用到了vector容器,是在ACM集訓中學到的,前陣子還沒開通博客也沒來得及總結學習,堅持每天一個博客,努力把總結內容補起來~
(2)直接聲明重載:
vector<Student> V; bool operator<(const Student& s1, const Student& s2) { return s1.id>s2.id;//降序排列 } sort(V.begin(),V.end());
註意:sort預設使用的是<運算符,所以要針對<來重載,而不能使用>哦~。
D、使用標準庫中的函數:
functional提供了一堆基於模板的比較函數對象,
但sort要用到的也只是greater和less就夠了:
升序:sort(begin,end,less<data-type>())
降序:sort(begin,end,greater<data-type>())
缺點:也只是實現簡單的排序,結構體不適用,所以推薦自己寫規則吧~。
註:如果有更好的解法,真心希望您能夠評論留言貼上您的代碼呢~