(c语言)PAT JUDGE(25分)(不完全AC + 完全AC博客推荐 + 思路启发)

博客分享了浙大数据结构Mooc的C语言答案集,对题目进行闲谈,指出虽难度不大但细节把控难,存在重复计数等坑。给出了间接排序思路,利用表+插入排序。作者无心将题全AC,建议想全AC的同学参考其他博主,认为学好基础知识更重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


关于数据结构Mooc后的每一道答案
基本我都已经给出了详解
希望能对大家有所帮助
收藏一下也是方便大家查找吧
希望大家一起进步!

(c语言)浙大数据结构Mooc作者答案集


原题题目

在这里插入图片描述




闲谈

其实本质来说这道题难度不是那么难
对于但是对于没有完全Ac来说
只是要注意的坑地方太多了
就是细节的把控
比如 重复计数 还有分数累加 得分后又编译不通过等等。。
但我也无心再去花时间去把它AC掉 因为大体思路是正确的
只是存在一个最后一个检查点的一个地方考虑的不是那么好
大体思路还是正确的
这道题仅作思路参考吧
如果想做到全AC的同学可以跳转到其余博主这道题的博客
1075

柳神的1075 PAT JUDGE讲解
波点兔的1075 PAT JUDGE讲解
蔡军帅的1075 PAT JUDGE讲解




思路

我认为最需要思考的就是我们的间接排序
这里我利用了表+插入排序 使得原数据不发生改变
而储存其相应位置的
下面我只对间接排序给出分析
其余地方主要太杂 不好分析

#include <stdio.h>
#define MAXUSERS 10010
#define MAXPLOBLEMS 6
#define INF 999999

int main()
{
    int usernumbers,ploblemnumbers,submissions,i,j;
    int tempuser,tempploblem,tempscore,temp,position = 1,tempposition = 1,min = 99999,tempcount[MAXUSERS],tempperfect;
    scanf("%d %d %d",&usernumbers,&ploblemnumbers,&submissions);
    int scores[MAXPLOBLEMS],subscores[MAXUSERS][MAXPLOBLEMS],sumscores[MAXUSERS],perfect[MAXUSERS] = {0};
    for(i=1;i<=usernumbers;i++)
        sumscores[i] = -1;
    for(i=1;i<=ploblemnumbers;i++)
        scanf("%d",&scores[i]);
    for(i=1;i<=usernumbers;i++)
        for(j=1;j<=ploblemnumbers;j++)
            subscores[i][j] = -1;
    for(i=1;i<=usernumbers;i++)
        tempcount[i] = i;

	//这一块是对分数做统计
    for(i=0;i<submissions;i++)
    {
        scanf("%d %d %d",&tempuser,&tempploblem,&tempscore);
        if(scores[tempploblem] == tempscore  && subscores[tempuser][tempploblem] != scores[tempploblem])
            perfect[tempuser]++;
        if(subscores[tempuser][tempploblem] == -1)
        {
            if(sumscores[tempuser] == -1 && tempscore != -1)
                sumscores[tempuser] = 0;
            if(tempscore == 0 || tempscore==-1 && sumscores[tempuser] != -1)
                subscores[tempuser][tempploblem] = 0;
            else if(tempscore != -1)
            {
                subscores[tempuser][tempploblem] = tempscore;
                sumscores[tempuser] += tempscore;
            }
        }
        else if(subscores[tempuser][tempploblem] != -1 && tempscore > subscores[tempuser][tempploblem])
        {
            sumscores[tempuser] -= subscores[tempuser][tempploblem];
            subscores[tempuser][tempploblem] = tempscore;
            sumscores[tempuser] += tempscore;
        }
    }

	//这一块就是间接排序了 我们用数组tempcount来记录相对应的位置
	//如果是对当前牌位置的i计数 我们则不进行替换
	//如果是表示对当前牌位置的数进行表示 我们则用tempcount来记录相对应的位置
    for(i=2;i<=usernumbers;i++)
    {
        temp = sumscores[tempcount[i]];
        tempperfect = perfect[tempcount[i]];
        for(j=i;j>1 && temp > sumscores[tempcount[j-1]] || j>1 && temp == sumscores[tempcount[j-1]] && tempperfect > perfect[tempcount[j-1]];j--)
            tempcount[j] = tempcount[j-1];
        tempcount[j] = i;
    }
    
    for(i=1;i<=usernumbers;i++)
    {
        if(sumscores[tempcount[i]] != -1)
        {
            if(sumscores[tempcount[i]] < min)
            {
                printf("%d ",tempposition);
                min = sumscores[tempcount[i]];
                position = tempposition;
            }
            else
                printf("%d ",position);
            tempposition++;
            printf("%05d %d",tempcount[i],sumscores[tempcount[i]]);
            for(j=1;j<=ploblemnumbers;j++)
            {
                if(subscores[tempcount[i]][j] != -1)
                    printf(" %d",subscores[tempcount[i]][j]);
                else
                    printf(" -");
            }
            printf("\n");
        }
    }
    return 0;
}


提交结果

在这里插入图片描述



结束语

其实我也想把这道题给AC掉 心有余而力不足hhh
可能AC还是可以的 只是要再花一点时间
但是与其在这里纠结一个坑超级多的题
不如花时间去把基础知识学好 大体思路知道即可
有的时候 不完美也是一种完美

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值