結構體的sort排序


結構體用sort快排的方法

struct node{ int k,s; }p[5005]; bool cmp1(node x,node y){ return x.s>y.s;   //定義降序排序(從大到小) 
} bool cmp2(node x,node y){ return x.k<y.k;   //定義升序排序(從小到大) 
}
sort(p+1,p+n+1,cmp2); //排序 

看題目,洛谷p1068

題目描述

世博會志願者的選拔工作正在 A 市如火如荼的進行。為了選拔最合適的人才,A市對所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根據計划錄取人數的150%划定,即如果計划錄取m名志願者,則面試分數線為排名第m×150%(向下取整)名的選手的分數,而最終進入面試的選手為筆試成績不低於面試分數線的所有選手。

現在就請你編寫程序划定面試分數線,並輸出所有進入面試的選手的報名號和筆試成績。

輸入輸出格式

輸入格式:

 

第一行,兩個整數 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中間用一個空格隔開,其中n表示報名參加筆試的選手總數,m表示計划錄取的志願者人數。輸入數據保證 m×150%向下取整后小於等於 n。

第二行到第 n+1行,每行包括兩個整數,中間用一個空格隔開,分別是選手的報名號 k(1000 ≤ k ≤ 9999)和該選手的筆試成績s(1 ≤ s ≤ 100)。數據保證選手的報名號各不相同。

 

輸出格式:

 

第一行,有2個整數,用一個空格隔開,第一個整數表示面試分數線;第二個整數為進入面試的選手的實際人數。

從第二行開始,每行包含2個整數,中間用一個空格隔開,分別表示進入面試的選手的報名號和筆試成績,按照筆試成績從高到低輸出,如果成績相同,則按報名號由小到大的順序輸出。

 

輸入輸出樣例

輸入樣例#1: 
6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88
輸出樣例#1: 
88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88 

說明

【樣例說明】

m×150%=3×150%=4.5,向下取整后為4。保證44個人進入面試的分數線為88,但因為88有重分,所以所有成績大於等於88 的選手都可以進入面試,故最終有5個人進入面試。

NOIP 2009 普及組 第二題

 

 

這道題就是一個典型的結構體的排序

但是首先需要面試成績的從大到小的排序,然后才是相同的成績再去從小到大對編號去排序。

而sort是一個不穩定的排序,因為當數據量稍大時,sort()就會使用快速排序,而快速排序是不穩定排序,即不能保證原序列中相等的元素在排序后保持相對位置不變。

即如果排序之后的兩者成績相同,但是由於快排是不停的交換位置的排序,所以相同成績的兩者的相對位置會變換,所以造成的不穩定排序。

穩定排序的概念:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r [ i ]=r [ j ],且r [ i ]在r [ j ]之前,而在排序后的序列中,ri仍在rj之前,則稱這種排序算法是穩定的;否則稱為不穩定的。

所以這題應該用的是STL里面的穩定排序stable_sort。

AC代碼:

#include<iostream> #include<algorithm>
using namespace std; struct node{ int k,s; }p[5005]; bool cmp1(node x,node y){ return x.s>y.s;   //定義降序排序(從大到小) 
} bool cmp2(node x,node y){ return x.k<y.k;   //定義升序排序(從小到大) 
} int main(){ int n,m; cin>>n>>m; m=m*15/10; for(int i=1;i<=n;i++){ cin>>p[i].k>>p[i].s; } sort(p+1,p+n+1,cmp2); //快排排序 
    stable_sort(p+1,p+n+1,cmp1); //穩定排序
    cout<<p[m].s<<" "; for(int i=m+1;i<=n;i++){ if(p[i].s==p[m].s){ m++; } else break; } cout<<m<<endl; for(int i=1;i<=m;i++){ cout<<p[i].k<<" "<<p[i].s<<endl; } return 0; }

 

還有一種是對字符串的結構體sort排序。

 

題目背景

宇宙總統競選

題目描述

地球歷公元6036年,全宇宙准備競選一個最賢能的人當總統,共有n個非凡拔尖的人競選總統,現在票數已經統計完畢,請你算出誰能夠當上總統。

輸入輸出格式

輸入格式:

 

president.in

第一行為一個整數n,代表競選總統的人數。

接下來有n行,分別為第一個候選人到第n個候選人的票數。

 

輸出格式:

 

president.out

共兩行,第一行是一個整數m,為當上總統的人的號數。

第二行是當上總統的人的選票。

 

輸入輸出樣例

輸入樣例#1: 復制
5
98765
12365
87954
1022356
985678
輸出樣例#1: 復制
4
1022356

說明

票數可能會很大,可能會到100位數字。

n<=20

 

AC代碼:

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{
    string str;
    int p;
}aaa;

bool cmp(aaa a,aaa b){
    if(a.str.size()==b.str.size()){
        return a.str<b.str; 
    }
    return a.str.size()<b.str.size();
}
int main(){
    aaa m[22];
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m[i].str;
        m[i].p=i;
    }
    sort(m+1,m+n+1,cmp);
    cout<<m[n].p<<endl<<m[n].str;
    return 0;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM