杭电ACM Steps (1)

原题:
Problem Description
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的 
考生,并将他们的成绩按降序打印。 
 

Input
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N 
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一 
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号 
(题目号由1到M)。 
当读入的考生人数为0时,输入结束,该场考试不予处理。 
 

Output
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高 
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考 
号的升序输出。 
 

Sample Input
  
  
4 5 25 10 10 12 13 15 CS004 3 5 1 3 CS003 5 2 4 1 3 5 CS002 2 1 2 CS001 3 2 3 5 1 2 40 10 30 CS001 1 2 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 0
 

Sample Output
3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20


  
  
Hint
Huge input, scanf is recommended.
WA:
/*********************************
    时间:2016-03-29 10:07:53
    目的;杭电ACM Steps session3
********************************/

#include <stdio.h>
#include <string.h>

int student_amount = 1; //考生人数,初值不为0
int k; //存储学号的长度
int lower_bound;  //分数线
int count;//通过分数线的人数

/**
分数求和函数
**/
int sumfun(int score[], int num[], int num_length) {
    int m; //循环指标
    int num_buffer; //题号缓冲区
    int sumup = 0; //分数求和

    for(m=0; m < num_length; m++) {
        num_buffer = num[m] - 1; //将题号对应的分数数组中的下标赋给题号缓冲区
        sumup += score[num_buffer]; //累加对应分数
    }
    return sumup;
}

/**
输出结果函数
**/
void output(char stNumber_[][20], int sum_[],int stNumber_length_2) {
    int temp1; //存储分数最大值的中间变量
    char temp2[20]; //存储分数相同时学号较小字符数组的变量
    int i,j,m; //循环指标
    //分数排序
    for(j=0; j < student_amount; j++) {
        for(i=0; i < student_amount-j-1; i++) {
            if(sum_[i] < sum_[i+1]) {
                temp1 = sum_[i];
                sum_[i] = sum_[i+1];
                sum_[i+1] = temp1;
                for(m=0; m < k; m++) {
                    temp2[m] = stNumber_[i][m];
                    stNumber_[i][m] = stNumber_[i+1][m];
                    stNumber_[i+1][m] = temp2[m];
                }
            }
        }
    }
    //分数相同时学号升序排序
        for(i=0; i < student_amount-1; i++) {
            if(sum_[i] == sum_[i+1]) {
                for(m=0; m < k; m++) {
                    temp2[m] = stNumber_[i+1][m];
                    stNumber_[i+1][m] = stNumber_[i][m];
                    stNumber_[i][m] = temp2[m];
                }
            }
        }
    //统计通过分数线的人数
    if(count != 0) {count = 0;} //初始化count
    for(i=0; i < student_amount; i++) {
        if(sum_[i] >= lower_bound) {count++;}
    }
    //输出本场考试结果
    printf("%d\n", count);
    for(i = 0; i < student_amount; i++) {
        if(sum_[i] >= lower_bound) {
            for(j=0; j < k; j++) {
                printf("%c", stNumber_[i][j]);
            }
            printf(" %d\n", sum_[i]);
            }
    }
}

int main() {
        //while块每执行一次代表一次考试
        while(1) {
            scanf("%d", &student_amount);
            if(student_amount == 0) {break;}
            char buffer1; //字符缓冲区
            int problem_amount; //题目数量
            int pass_num;
            int o;
            scanf(" %d %d", &problem_amount, &lower_bound);
            int i,j; //循环指标
            //题目分数数组
            int problem_score[10];
            //获取各题目分数
            char stNumber[1000][20];//储存所有考号
            int sum[1000]; //储存本场老师每个学生分数的成绩数组
            memset(stNumber, 0, sizeof(stNumber)); //手动初始化数组

            for(i = 0; i < problem_amount; i++) {
                scanf("%d%c", &problem_score[i], &buffer1);
            }
            for(j=0; j < student_amount; j++ ) {
                char buffer = '\0';    //字符缓冲区
                char str[20] ; //学号数组
                memset(str,0,20); //手动初始化数组
                int solve_amount = 0; //一个学生解决的题目数量
                k=0;

                //获取学号数据
                for(i=0; i<20; i++) {
                    scanf("%c", &buffer);
                    if(buffer != 32) {
                        str[i] = buffer;
                        k = i+1; //获取该数组非空元素的个数
                    } else {
                        break;
                    }
                }
                //清除缓冲区
                buffer = '\0';
                //读入解决的题目数量
                scanf("%d ", &solve_amount);
                //根据获得的题数来创建题目数组
                int solve_num[10];
                for(i=0; i < solve_amount; i++) {
                    scanf("%d", &solve_num[i]);
                    scanf("%c", &buffer);
                }
                //将该考生分数放入成绩数组内
                sum[j] = sumfun(problem_score, solve_num, solve_amount);
                //将该考生考号放入本场考试的考号数组
                for(i=0; i < k; i++){
                    stNumber[j][i] = str[i];
                }

                if(j == student_amount-1) {
                    output(stNumber, sum, k);
                }
            }
        }
        return 0;
}



/********************************
Program Example:
4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
3
CS003 60
CS001 37
CS004 37
1 2 40
10 30
CS001 1 2
0
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
1
CS000000000000000002 20
0

Process returned 0 (0x0)   execution time : 93.178 s
Press any key to continue.
********************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM Codebook(ACM代码手册)是一本整理了算法竞赛常用算法和数据结构的参考手册。它是为了帮助算法竞赛选手快速查阅各种算法和数据结构的实现而编的。 ACM Codebook的内容非常丰富,包括了各种常用算法,如排序算法、图论算法、动态规划算法等。同时,它还包含了各种常用数据结构的实现,如链表、栈、队列、堆等。此外,ACM Codebook还介绍了一些常见的算法设计技巧和优化技巧,帮助选手更好地解决问题。 ACM Codebook的作用非常明显,首先它提供了各种算法和数据结构的实现代码,方便选手直接复制粘贴使用,节省了编代码的时间。其次,ACM Codebook提供了详细的算法和数据结构的说明和示例,帮助选手理解和掌握这些算法和数据结构的原理和用法。最后ACM Codebook还提供了一些常见问题的解决方案,帮助选手快速解决问题。 ACM Codebook的编并不容易,需要作者具备扎实的算法和数据结构基础,并且对算法竞赛有深入的了解。编ACM Codebook需要不断地修改和更新,以适应算法竞赛中不断变化的需求。 总之,ACM Codebook是一本非常有用的参考手册,它不仅提供了丰富的算法和数据结构的实现,还提供了对应的说明和示例,帮助算法竞赛选手快速掌握和应用这些算法和数据结构。它是算法竞赛选手在比赛中必备的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值