郑州轻工业大学 数据结构 拼题A -- 排序部分

郑州轻工业大学 数据结构 拼题A – 排序部分

文章目录

    • 郑州轻工业大学 数据结构 拼题A -- 排序部分
    • 7-22 排序 (25分)
    • 7-23 互评成绩 (25分)
    • 7-24 人以群分 (25分)
    • 7-25 寻找大富翁 (25分)
    • 7-26 PAT排名汇总 (25分)

7-22 排序 (25分)

题目描述:
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。

输入格式:
输入第一行给出正整数N(≤10​5​​),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981

sort 完美水过~~

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 1e5 + 9;

long long a[MAXSIZE];
int n;

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i ++)
        scanf("%lld", &a[i]);
        
    sort(a, a + n);
    
    for(int i = 0; i < n; i ++)
        printf("%lld%c", a[i], i == n-1 ? '\n': ' ');
    return 0;
}

7-23 互评成绩 (25分)

题目描述:
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。

输入格式:
输入第一行给出3个正整数N(3 < N ≤10​4​​,学生总数)、k(3 ≤ k ≤ 10,每份作业的评审数)、M(≤ 20,需要输出的学生数)。随后N行,每行给出一份作业得到的k个评审成绩(在区间[0, 100]内),其间以空格分隔。

输出格式:
按非递减顺序输出最后得分最高的M个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。

输入样例:

6 5 3
88 90 85 99 60
67 60 80 76 70
90 93 96 99 99
78 65 77 70 72
88 88 88 88 88
55 55 55 55 55

输出样例:

87.667 88.000 96.000

同样的套用sort~~~

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 1e4 + 9;

int n, k, m;
int a[MAXSIZE][15];
double ans[MAXSIZE];

int main()
{
    scanf("%d%d%d", &n, &k, &m);
    
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < k; j++)
            scanf("%d", &a[i][j]);
            
        sort(a[i], a[i] + k);
        
        int sum = 0;
        for(int j = 1; j < k - 1; j++)
            sum += a[i][j];
            
        ans[i] = 1.0 * sum / (k - 2);
    }
    
    sort(ans, ans + n);
    
    for(int i = n - m; i < n; i++)
        printf("%.3f%c", ans[i], i == n - 1 ? '\n' : ' ');
    return 0;
}

7-24 人以群分 (25分)

题目描述:
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。

输入格式:
输入第一行给出一个正整数N(2≤N≤10​5​​)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过2​31​​。

输出格式:
按下列格式输出:

Outgoing #: N1
Introverted #: N2
Diff = N3

其中N1是外向型人的个数;N2是内向型人的个数;N3是两群人总活跃度之差的绝对值。
输入样例1:

10
23 8 10 99 46 2333 46 1 666 555

输出样例1:

Outgoing #: 5
Introverted #: 5
Diff = 3611

输入样例2:

13
110 79 218 69 3721 100 29 135 2 6 13 5188 85

输出样例2:

Outgoing #: 7
Introverted #: 6
Diff = 9359

判断总人数够不够均分(N% 2 == 0),能均分则对半分配,不能则判断给哪边多分一个能使两群人总活跃度之差的绝对值更大。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 1e5 + 9;

int n;
int a[MAXSIZE];

int main()
{
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
        
    sort(a, a + n);
    
    int mid = n / 2;
    
    int sum1 = 0;
    for(int i = 0; i < mid; i++)
        sum1 += a[i];
        
    int sum2 = 0;
    for(int i = mid; i < n; i++)
        sum2 += a[i];
        
    if(n % 2 == 0)
    {
        printf("Outgoing #: %d\n", mid);
        printf("Introverted #: %d\n", mid);
        printf("Diff = %d\n", abs(sum2 - sum1));
    }
    else
    {
        int sum3 = 0;
        for(int i = 0; i <= mid; i++)
            sum3 += a[i];
            
        int sum4 = 0;
        for(int i = mid + 1; i < n; i++)
            sum4 += a[i];
            
        if(abs(sum2 - sum1) > abs(sum4 - sum3))
        {
            printf("Outgoing #: %d\n", mid + 1);
            printf("Introverted #: %d\n", mid );
            printf("Diff = %d\n", abs(sum2 - sum1));
        }
        else
        {
            printf("Outgoing #: %d\n", mid );
            printf("Introverted #: %d\n", mid + 1);
            printf("Diff = %d\n", abs(sum4 - sum3));
        }
    }
    return 0;
}

7-25 寻找大富翁 (25分)

题目描述:
胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:
输入首先给出两个正整数N(≤10​6​​)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:
在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

20 18 12

注意 n < m 的情况

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 1e6 + 9;

int n, m;
long long a[MAXSIZE];

bool cmp(long long x, long long y)
{
    return x > y;
}

int main()
{
    scanf("%d%d", &n, &m);
    
    for(int i = 0; i < n; i++)
        scanf("%lld", &a[i]);
        
    sort(a, a + n, cmp);
    
    if(n < m)
        m = n;
        
    for(int i = 0; i < m; i++)
        printf("%lld%c", a[i], i == m - 1 ? '\n' : ' ');
    return 0;
}

7-26 PAT排名汇总 (25分)

题目描述:
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。

输入格式:
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。

输出格式:
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。

输入样例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

注意考号不足13位的情况

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 30009;

int n, k;

struct Stu
{
    long long id; // 考号
    int score; // 成绩
    int last_r; // 最终排名
    int test_id; // 考点编号
    int cur_r; // 在该考点的排名
};

Stu a[MAXSIZE];

bool cmp(Stu x, Stu y)
{
    if(x.score != y.score)
        return x.score > y.score;
    return x.id < y.id;
}

int main()
{
    scanf("%d", &n);
    
    int cur_id = 1;
    int before = 0;
    int sum = 0;
    
    while(n--)
    {
        scanf("%d", &k);
        
        sum += k;
        
        for(int i = before; i < before + k; i++)
        {
            scanf("%lld %d", &a[i].id, &a[i].score);
            a[i].test_id = cur_id;
        }
        
        cur_id ++;
        
        sort(a + before, a + k + before, cmp);
        
        for(int i = before; i < before + k; i++)
        {
            if (i == before)
                a[i].cur_r = i + 1 - before;
            else
            {
                if(a[i].score == a[i - 1].score)
                    a[i].cur_r = a[i - 1].cur_r;
                else
                    a[i].cur_r = i + 1 - before;
            }
        }
        before += k;
    }
    
    sort(a, a + sum, cmp);
    
    for(int i = 0; i < sum; i++)
    {
        if (i == 0)
            a[i].last_r = i + 1;
        else
        {
            if(a[i].score == a[i - 1].score)
                a[i].last_r = a[i - 1].last_r;
            else
                a[i].last_r = i + 1;
        }
    }
    
    printf("%d\n", sum);
    
    for(int i = 0; i < sum; i ++)
        printf("%013lld %d %d %d\n", a[i].id, a[i].last_r, a[i].test_id, a[i].cur_r);
    return 0;
}

总结:sort太好用辣hhhhh

你可能感兴趣的:(一些题吧,算法,数据结构,排序算法)