| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1637 人关注过本帖
标题:请看看这一题的代码应该怎么写吧
只看楼主 加入收藏
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
结帖率:96.88%
收藏
已结贴  问题点数:20 回复次数:7 
请看看这一题的代码应该怎么写吧
N名考生参加一场考试。这场考试共有M道题,每道题目分值不一,考生答对题目的总分达到或超过G则算通过考试。
告诉你每道题的分值,以及每名考生答对的题目的编号,
请按照总成绩降序的顺序,输出通过考试的考生号和分数。
【输入】
第1行有3个正整数,分别为参加考试的人数 N (1 ≤ N ≤ 10)、问题数M (1 ≤ M ≤ 10)、通过分数线G;
第2行有空格分隔的 M 个正整数,分别为第1题至第 M 题的分值
随后 N 行,每行给出一名考生的考生号、答对问题数量s、
以及这s道题的题号(问题从1开始编号),两两之间以一个空格隔开。
输入数据保证所有输入和输出整数在 int 范围内,考生号为长度不超过20的无空格字符串且不重复。
【输出】
第1行输出一个整数X,表示通过考试的考生数量,
接下来的X行,按总分降序输出通过考试的每位考生的考生号与总分,用空格隔开。
如果有考生的答对题目的总分相等,则考生号字符串的字典序较小的排在前面。
【样例输入】
4 5 25
10 10 12 13 15
SE004 3 5 1 3
SE003 5 2 4 1 3 5
SE002 2 1 2
SE001 3 2 3 5
【样例输出】
3
SE003 60
SE001 37
SE004 37
搜索更多相关主题的帖子: 考试 输入 总分 空格 输出 
2019-12-22 18:19
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
没有思路

我想要两颗西柚。
2019-12-22 18:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct candidate
{
    char name[21];
    unsigned score;
};

int cmp_candidate( const void* a, const void* b )
{
    const struct candidate* c = (const struct candidate*)a;
    const struct candidate* d = (const struct candidate*)b;
    if( c->score > d->score )
        return -1;
    if( c->score < d->score )
        return +1;
    return strcmp(c->name,d->name);
}

int main( void )
{
    // 繁琐无聊的输入
    unsigned n, m, g;
    scanf( "%u%u%u", &n, &m, &g );

    unsigned scores[10];
    for( unsigned i=0; i!=m; ++i )
        scanf( "%u", scores+i );

    struct candidate guys[10];
    for( unsigned i=0; i!=n; ++i )
    {
        unsigned count;
        scanf( "%s%u", guys[i].name, &count );
        guys[i].score = 0;
        for( unsigned j=0; j!=count; ++j )
        {
            unsigned index;
            scanf( "%u", &index );
            guys[i].score += scores[index-1];
        }
    }

    // 排序
    qsort( guys, n, sizeof(*guys), &cmp_candidate );

    // 输出
    for( unsigned i=0; i!=n && guys[i].score>=g; ++i )
        printf( "%s %u\n", guys[i].name, guys[i].score );
}
2019-12-22 19:27
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 3楼 rjsp
好像有一点小问题 不能AC

我想要两颗西柚。
2019-12-22 20:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 4楼 komorebi0110
我仔细看了一下,忘了这个
第1行输出一个整数X,表示通过考试的考生数量

你自己加一下吧
2019-12-22 20:47
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 5楼 rjsp
好的好的,非常感谢

我想要两颗西柚。
2019-12-22 20:54
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 5楼 rjsp
!!好厉害 结构体太难了

我想要两颗西柚。
2019-12-22 21:51
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 3楼 rjsp
很抱歉再次打扰您 那个cmp-candidate的用法没搞明白
我查了qsort的用法对结构体二级排序

struct In { int x; int y; }s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp(const void *a,const void *b)
{  struct In *c=(In *)a;struct In *d=(In *)b;
if(c->x != d->x)
 return c->x - d->x;
else
 return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);

但是本题的输出应该是您写出的那样 原理是什么啊

我想要两颗西柚。
2019-12-22 22:53
快速回复:请看看这一题的代码应该怎么写吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018106 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved