排序算法的例题

车厢重组

门儿

冒泡排序,每次交换即为调转车厢,ans++

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[10000];
int ans; 
int main(){
    cin >> n;
    for(int i = 1;i <= n; i++) cin >> a[i];
    for(int i = 1;i <= n; i++){
        for(int j = 1;j <= n - i; j++){
            if(a[j] > a[j+1]){
                swap(a[j],a[j+1]);
                ans++;
            }
        }
    } 
    cout << ans << endl;
    return 0;
}

求逆序对

传送

归并排序。合并的时候,被放进去的数字右边的所有数字都可以组成逆序对。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long ans = 0;
int a[500400];
int b[500400];
int L[500400],R[500400];
int RT = 0;
void msort(int l,int r){
    if(l == r) return;
    int mid = (l+r) >>1;
    msort(l,mid);
    msort(mid+1,r);
    int i = l,j = mid + 1;
    int cnt = l;
    while(j <= r && i <= mid){
        if(a[i] > a[j]){
            ans += mid - i + 1;
            b[cnt++] = a[j++];
        }
        if(a[i] <= a[j]){
            b[cnt++] = a[i++];
        }
    }
    while(j <= r)
        b[cnt++] = a[j++];
    while(i <= mid)
        b[cnt++] = a[i++];
    for(int i = l;i <= r; i++)
        a[i] = b[i];
}
int main(){
    cin >> n;
    for(int i = 1;i <= n; i++){
        cin >> a[i];
    }
    msort(1,n);
    cout << ans << endl;
    return 0;
}

谁考了第k名

小门

这个就很水了就不说了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
    int num;
    double sco;
}stu[1000];
bool cmp(STU a,STU b){
    return a.sco > b.sco;
}
int main(){
    cin >> n >> k;
    for(int i = 1;i <= n; i++)
        cin >> stu[i].num >> stu[i].sco;;
    sort(stu + 1,stu + 1 + n,cmp);
    cout << stu[k].num << ' ' << stu[k].sco << endl;
    return 0;
}

奇数单增序列

门门

这个也挺水,直接把偶数扔掉就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[1000];
int main(){
    int tot = 1;
    cin >> n;
    for(int i = 1;i <= n; i++){
        int f;
        cin >> f;
        if(f % 2)
            a[tot++] = f; 
    }
    tot--;
    sort(a+1,a+tot+1);
    for(int i = 1;i <= tot;i++){
        cout << a[i];
        if(i != tot) cout <<',';
    }
    return 0;
}

成绩排序

水题

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
    string name;
    int sco;
}stu[1000];
bool cmp(STU a,STU b){
    return a.sco >= b.sco;
}
int main(){
    cin >> n;
    for(int i = 1;i <= n; i++)
        cin >> stu[i].name >> stu[i].sco;;
    sort(stu + 1,stu + 1 + n,cmp);
    for(int i = 1;i <= n; i++){
        cout << stu[i].name << ' ' << stu[i].sco << endl;
    }
    return 0;
}

奖学金

门门

多关键字排序。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
    int num;
    int sco;
    int chi,mat,eng;
}stu[1000];
bool cmp(STU a,STU b){
    if(a.sco != b.sco) return a.sco > b.sco;
    if(a.chi != b.chi) return a.chi > b.chi;
    return a.num < b.num;
}
int main(){
    cin >> n;
    for(int i = 1;i <= n; i++){
        stu[i].num = i;
        cin >> stu[i].chi >> stu[i].mat >> stu[i].eng;
        stu[i].sco = stu[i].chi + stu[i].mat + stu[i].eng;
    }
    sort(stu + 1,stu + 1 + n,cmp);
    for(int i = 1;i <= 5; i++){
        cout << stu[i].num << ' ' << stu[i].sco << endl;
    } 
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Cao-Yucong/p/12184497.html