sort函式自定義排序
咳咳,自定義排序說實話用的地方還是很多的,像ACM里面,天梯賽里面,特別是天梯,必出這玩意,,,咳咳,水點字數,咱繼續,
- 首先哈,我們來看一下c++自帶的排序;

-
可以看出哈,默認是按升序排序的,
-
sort不但可以對整型進行排序還能對字串進行排序,

- 咳咳,好像講偏了哈,今天主要是講自定義排序哈,c++自帶的只是排升序,但是我要排降序怎么辦呢,這個時候就需要我們自定義排序了,

- 這里我們可以看到那個cmp比較函式哈,排序規則也很簡單,你想著降序是大的在前面,所以前面的數大于后面的數,所以寫成 a>b 就可以了,是不是很好記,而且,系統自帶的sort排序也是快速排序,還是很香的,
- 這里是對陣列進行排序,當出現結構的時候,有多個引數進行排序,其實可以直接在結構體里面進行cmp比較,然后直接sort就能夠實作你想要的排序,
- 然后這里也有兩種常見的寫法,先來看看 cmp函式 吧!
- 題目: 我們第一階級排序是對 x 進行排降序,在 x 相等的情況下,我們對 y 進行排升序,

bool cmp(node a,node b){
if(a.x!=b.x)return a.x>b.x;
return a.y<b.y;
}
- 我們只需要這樣寫就能完成對結構體多級階級的排序了,
- 然后第二種常見的寫法就是在結構體里面,對 小于號< 方法的多載,內部撰寫邏輯也能實作多級排序,

bool operator <(const node &b)const{
if(x!=b.x)return x>b.x;
return y<b.y;
}
- 區別也不大,一個寫在結構體里面,直接用sort就行,一個寫個函式,加個函式名就行,蘿卜白菜,各有所愛,所以你喜歡哪一種呢?
- 可能有人在問,你老是放圖片干啥,直接放代碼滿,咳咳,我解釋下哈,我覺得這個代碼呢,需要你自己去打,多打,打了才會是你自己的,
- 咳咳,學到這里,差不多也應該會用了,然后我們現在來實戰一下,
L2-009 搶紅包 (25分)
題目鏈接:(點我看題<-----這是一個鏈接)
沒有人沒搶過紅包吧…… 這里給出N個人之間互相發紅包、搶紅包的記錄,請你統計一下他們搶紅包的識訓,
輸入格式:
輸入第一行給出一個正整數N(≤10?4 ),即參與發紅包和搶紅包的總人數,則這些人從1到N編號,隨后N行,第i行給出編號為i的人發紅包的記錄,格式如下:
K N1 P1 Nk Pk
其中K(0≤K≤20)是發出去的紅包個數,Ni 是搶到紅包的人的編號,Pi (>0)是其搶到的紅包金額(以分為單位),注意:對于同一個人發出的紅包,每人最多只能搶1次,不能重復搶,
輸出格式:
按照收入金額從高到低的遞減順序輸出每個人的編號和收入金額(以元為單位,輸出小數點后2位),每個人的資訊占一行,兩數字間有1個空格,如果收入金額有并列,則按搶到紅包的個數遞減輸出;如果還有并列,則按個人編號遞增輸出,
輸入樣例:
10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10
輸出樣例:
1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.32
- 這題根據題目要求,要對三個階級進行排序,先按 收入 排 降序 ,如果收入相等,那就按照 搶到紅包的個數 進行排 降序 ,最后如何紅包的個數也相等,那就按照 個人的編號 進行排 升序 ,
- 好了,了解他們的結構以后呢,那就可以寫了,先建立資料結構,然后按照題目意思進行讀取值并累計,
- 代碼如下:
#include<bits/stdc++.h>
using namespace std;
struct node{
int id;
int fa;
int fachu;
int k ;
float shouru;
/* 這是小于號的多載 */
bool operator <(const node &b)const{
if(shouru!=b.shouru)return shouru>b.shouru;
else if(k!=b.k)return k>b.k;
return id<b.id;
}
}a[110000];
/* 這是cmp函式 */
// bool cmp(struct node a , struct node b){
// if(a.shouru!=b.shouru)return a.shouru>b.shouru;
// else if(a.k!=b.k) return a.k>b.k;
// else return a.id<b.id;
// }
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
a[i].id = i;
int k;
cin>>k;
int sum = 0;
while(k--)
{
int id, s;
cin>>id>>s;
sum = sum+s;
a[id].fachu = a[id].fachu+s;
a[id].k++;
}
a[i].fa = sum;
}
for(int i=1;i<=n;i++)
a[i].shouru = (a[i].fachu - a[i].fa)*1.0/100;
sort(a+1,a+n+1); //小于號多載使用
// sort(a+1,a+n+1,cmp); 函式使用
for(int i=1;i<=n;i++) printf("%d %.2f\n",a[i].id,a[i].shouru);
return 0;
}
- ok,今天的自定義就到這了,我干飯去了,,,,
- 隸屬于演算法競賽入門到進階完整學習路線 <-----這是一個鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235575.html
標籤:其他
上一篇:zzuli 20級第七次周賽 2745 問題K: 學長的棒棒糖
下一篇:演算法實作自動掃雷游戲
