当前位置: 代码迷 >> 综合 >> (c语言)PAT JUDGE(25分)(不完全AC + 完全AC博客推荐 + 思路启发)
  详细解决方案

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

热度:72   发布时间:2023-11-17 20:53:41.0

文章目录

    • 原题题目
    • 闲谈
    • 思路
    • 提交结果
    • 结束语


关于数据结构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 999999int 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;}elseprintf("%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]);elseprintf(" -");}printf("\n");}}return 0;
}


提交结果

在这里插入图片描述



结束语

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

在这里插入图片描述