【C/C++】PAT A1025 Ranking/算法笔记

题目意思大概是输入一堆人的学号,成绩,给出学号,总排名,考场号,考场内排名。
这是我第一次写的:

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 30005;

struct Student
{
   int registnum[13];
   int score;
   int rank_in_group;
   int group;
};

Student stu[maxn]; //创建数组用于存储

bool cmp(Student a, Student b)
{
   if(a.score != b.score) return a.score > b.score;
   else return a.registnum < b.registnum;
}

int main()
{
   //输入
   int n, k, num=0;
   scanf("%d", &n);
   //fflush(stdin);
   for (int i = 1; i <= n; i++) //考场号
   {
      scanf("%d", &k);
      ///fflush(stdin);
      for (int j = 0; j < k; j++)
      {
         scanf("%d%d", &stu[num].registnum, &stu[num].score);
         stu[num].group = i; 
         num++;
      }
      //组内排名
      sort(stu + num - k, stu + num, cmp);
      //组内排号
      stu[num - k].rank_in_group = 1;
      for (int j = 1; j < k; j++)
      {  
         if (stu[num - k + j].score != stu[num - k + j - 1].score)
         {
            stu[num - k + j].rank_in_group = stu[num - k + j - 1].rank_in_group + 1;
         }
         else
         {
            stu[num - k + j].rank_in_group = stu[num - k + j - 1].rank_in_group;
         }
      }
   }
   printf("%d\n", num); //总人数
   sort(stu, stu + num, cmp);
   int r = 1;
   for (int i = 0; i < num; i++)
   {
      if (i>0 && stu[i].score != stu[i-1].score) //避免出现数组访问问题
      {
         r = i + 1;
      }
      printf("%d %d %d %d\n", stu[i].registnum, r, stu[i].group, stu[i].rank_in_group);
   }

   system("pause");
}

但是有问题,那个学号总是输入不对。后来一想是因为13位数字的数组,输入的话得一个一个输入(输入到每个位置)。
但是直接int a[13]然后输入scanf("%d",&a)这样
肯定只能输入到一个里面
比如这段测试代码:

(剩余的奇怪数字是因为没有清内存)
然而13位的学号,对于单个是int型的数组来说,又超内存了
int是一种数据类型,在编程语言C中,是用于定义整数类型变量的标识符。在一般的电脑中,int占用4字节,32比特,数据范围为-21474836482147483647[-2^312^31-1]
然后就把改成了输入字符串数组,因为用scanf("%s",a)的话,他就会自己放进去了

posted @ 2020-12-18 14:51  KinoLogic  阅读(81)  评论(0编辑  收藏  举报