菠萝的成绩单(结构体多元素快排)

菠萝的成绩单

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

考完试以后,菠萝获得了一个含有 n 个成绩的成绩单,他要把成绩按照从高到低排序,如果成绩相同则按照学生编号从小到大排序。

老师为了检验菠萝是否把成绩排序对了,会询问前 m 高的成绩及该学生的编号,你能帮菠萝回答老师的询问吗?

Input

输入数据有多组(数据组数不超过 10),到 EOF 结束。

对于每组数据:

  • 第一行输入成绩的个数 n 以及 m (1 <= n <= 100000, 1 <= m <= n)
  • 接下来的 n 行,每行输入 2 个正整数,分别为学生编号 id (1 <= id <= n),成绩 ai (1 <= ai <= 10000)

当 n 和 m 同时为 0 时结束程序。

Output

对于每组数据:

  • 第一行输出 "Case #x:" (输出不包括引号,且冒号后无空格),x 表示当前为第几组数据
  • 之后输出 m 行。每行格式按照 "编号 成绩" 的格式输出

Sample Input

3 1
1 1
2 2
3 3
5 3
4 2
2 2
1 1
3 3
5 2
0 0

Sample Output

Case #1:
3 3
Case #2:
3 3
2 2
4 2

Hint

请大家仔细核对 "Case #x:",建议复制样例输出的模式以防输出时不符合题目要求而导致的 Wrong Answer。

数据量较大,请使用高效排序算法。

Source

【2016级《程序设计基础(B)II》期末上机考试-第一场】MLE_kenan

//多元素快排
#include<stdio.h>
#include<string.h>

int top  = 1  ;

struct node
{
    int id ;
    int ai ;
}a[100010];


void q_sort(struct node *a , int left,  int right)
{
    if(left>=right)
        return ;
    int i , j ;
    struct node key   ;
    i = left ;  j = right ;
    key = a[i] ;
    while(i<j)
    {
        while(i<j&&((a[j].ai<key.ai)||(a[j].ai==key.ai&&a[j].id>key.id)))
            j-- ;
        a[i] = a[j] ;
        while(i<j&&((a[i].ai>key.ai)||(a[i].ai==key.ai&&a[i].id<key.id)))
            i++ ;
        a[j] = a[i] ;
    }
    a[i] = key ;
    q_sort(a,left,i-1) ;
    q_sort(a,i+1,right) ;
}

int main()
{
    int n, m  ;
    int i ;

    while(~scanf("%d %d",&n,&m))
    {
        if(n==0&&m==0)
            break ;
        for(i = 0 ;  i< n ;i++)
            scanf("%d %d",&a[i].id,&a[i].ai) ;
        q_sort(a,0,n-1) ;
        i  = 0 ;
        printf("Case #%d:\n",top)  ;
        while(m--)
        {
            printf("%d %d\n",a[i].id,a[i].ai) ;
            i++ ;
        }
        top++ ;
    }
    return 0 ;
}


/***************************************************
User name:
Result: Accepted
Take time: 148ms
Take Memory: 928KB
Submit time: 2019-04-28 16:44:00
****************************************************/

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要构建结构体数组中的结构体数组元素,你可以按照以下步骤进行: 1. 定义结构体:首先,你需要定义一个结构体,包含你所需的字段和属性。例如,假设你要构建一个学生信息的结构体,可以包含姓名、年龄和成绩等字段。 2. 声明结构体数组:在你的代码中,声明一个结构体数组,并指定数组的大小。例如,你可以声明一个包含10个学生信息的结构体数组。 3. 初始化结构体数组元素:使用循环语句遍历结构体数组,并为每个元素赋值。你可以通过访问结构体的字段来为每个元素赋予相应的值。 下面是一个示例代码,演示了如何构建结构体数组中的结构体数组元素: ```c #include <stdio.h> // 定义学生信息的结构体 struct Student { char name[20]; int age; float score; }; int main() { // 声明包含3个学生信息的结构体数组 struct Student students; // 初始化结构体数组元素 for (int i = 0; i < 3; i++) { printf("请输入第%d个学生的姓名:", i + 1); scanf("%s", students[i].name); printf("请输入第%d个学生的年龄:", i + 1); scanf("%d", &students[i].age); printf("请输入第%d个学生的成绩:", i + 1); scanf("%f", &students[i].score); } // 打印结构体数组元素 for (int i = 0; i < 3; i++) { printf("第%d个学生的姓名:%s\n", i + 1, students[i].name); printf("第%d个学生的年龄:%d\n", i + 1, students[i].age); printf("第%d个学生的成绩:%.2f\n", i + 1, students[i].score); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值