• C++
  • 信奥1班2024暑假集训day4-真题算法专项演练-排序算法

  • @ 2024-7-4 9:53:11

明明随机数题解

image

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
int q[N];

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
    sort(q, q + n);
    int k = unique(q, q + n) - q;
    printf("%d\n", k);
    for (int i = 0; i < k; i ++ ) printf("%d ", q[i]);
    return 0;
}

奖学金 题解

image

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 310;

struct Person
{
    int chinese, math, english;
    int total;
    int id;
    bool operator< (const Person& W)const
    {
        if (total != W.total) return total > W.total;
        if (chinese != W.chinese) return chinese > W.chinese;
        return id < W.id;
    }
}person[N];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ )
    {
        int chinese, math, english;
        scanf("%d%d%d", &chinese, &math, &english);
        int total = chinese + math + english;
        person[i] = {chinese, math, english, total, i};
    }

    sort(person + 1, person + 1 + n);

    for (int i = 1; i <= 5; i ++ ) printf("%d %d\n", person[i].id, person[i].total);
    return 0;
}

分数线划定题解

image

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 5010;

int n, m;

struct Person
{
    int id, score;
    bool operator< (const Person &W)const
    {
        if (score != W.score) return score > W.score;
        return id < W.id;
    }
}person[N];

int main()
{
    scanf("%d%d", &n, &m);

    for (int i = 0; i < n; i ++ ) scanf("%d%d", &person[i].id, &person[i].score);
    sort(person, person + n);

    int k = m * 1.5;
    while (k < n && person[k - 1].score == person[k].score) k ++ ;
    printf("%d %d\n", person[k - 1].score, k);
    for (int i = 0; i < k; i ++ ) printf("%d %d\n", person[i].id, person[i].score);

    return 0;
}

瑞士轮

image

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 200010;

int n, m, k;
int s[N], w[N], q[N], q0[N], q1[N];

bool cmp(int a, int b)
{
    if (s[a] != s[b]) return s[a] > s[b];
    return a < b;
}

int main()
{
    scanf("%d%d%d", &n, &m, &k);

    for (int i = 0; i < n * 2; i ++ ) scanf("%d", &s[i]);
    for (int i = 0; i < n * 2; i ++ ) scanf("%d", &w[i]);
    for (int i = 0; i < n * 2; i ++ ) q[i] = i;

    sort(q, q + n * 2, cmp);

    while (m -- )
    {
        int t0 = 0, t1 = 0;
        for (int i = 0; i < n * 2; i += 2)
        {
            int a = q[i], b = q[i + 1];
            if (w[a] < w[b])
            {
                s[b] ++ ;
                q0[t0 ++ ] = a;
                q1[t1 ++ ] = b;
            }
            else
            {
                s[a] ++ ;
                q0[t0 ++ ] = b;
                q1[t1 ++ ] = a;
            }
        }

        int i = 0, j = 0, t = 0;
        while (i < t0 && j < t1)
            if (cmp(q0[i], q1[j]))
                q[t ++ ] = q0[i ++ ];
            else
                q[t ++ ] = q1[j ++ ];
        while (i < t0) q[t ++ ] = q0[i ++ ];
        while (j < t1) q[t ++ ] = q1[j ++ ];
    }

    printf("%d\n", q[k - 1] + 1);

    return 0;
}

插入排序

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 8010;

int n, m;
int a[N], b[N], c[N];

bool cmp(int x, int y)
{
    if (a[x] != a[y]) return a[x] < a[y];
    return x < y;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ )
    {
        scanf("%d", &a[i]);
        b[i] = i;
    }

    sort(b + 1, b + n + 1, cmp);
    for (int i = 1; i <= n; i ++ )
        c[b[i]] = i;

    while (m -- )
    {
        int t, x, v;
        scanf("%d%d", &t, &x);
        if (t == 1)
        {
            scanf("%d", &v);
            a[x] = v;
            int k = c[x];

            while (k > 1 && (a[b[k - 1]] > a[b[k]] || a[b[k - 1]] == a[b[k]] && b[k - 1] > b[k]))
            {
                swap(b[k - 1], b[k]);
                swap(c[b[k - 1]], c[b[k]]);
                k -- ;
            }
            while (k < n && (a[b[k + 1]] < a[b[k]] || a[b[k + 1]] == a[b[k]] && b[k + 1] < b[k]))
            {
                swap(b[k + 1], b[k]);
                swap(c[b[k + 1]], c[b[k]]);
                k ++ ;
            }
        }
        else printf("%d\n", c[x]);
    }

    return 0;
}

0 条评论

目前还没有评论...