ICPC大作业

先导题 1346 学生会

https://acm.sjtu.edu.cn/OnlineJudge/problem/1346

错误

1.这道题犯了一个很容易忽略的问题,这个题原义是说当两个数平均值相同的时候,要逐个对各课程成绩比较,有一个大于另一方就结束比较。而我当时想既然比较avg(sum/9),那我直接算sum就好了,但是这有一个问题就是当sum 差值在9以内的时候,两个数avg相同,按理应该比较各科目的分数,但实际上两个数sum不同我已经结束了判断,这就使顺序出了问题。

\\错误举例
9 student_SIIU female 3 47 426   //此处SIIU 的 sum = 426 ,EZYC 的 sum = 431 按照sum的比较应该EZYC在SIIU的前面,但是两个
(93 40 73 35 54 80 29 20 2 )     //人的avg是相同的,之后如果按照下面的成绩进行比较,SIIU 93 > 14 EZYC 应该SIIU在EZYC前面
10 student_EZYC female 7 47 431
(14 4 36 67 22 71 66 69 82 )

2.第二个错误是题目中说的是在调用flush之前,不对排名进行更新,而我在print名单的时候,对set进行的遍历,而set是实时更新的,这样就使得答案本来是需要我输出一个未更新的排序,但是我却输出了一个更新后的排序,对这个错误,我想到了一个好的办法,最开始为了方便查找排名,我创建了rank_list数组,而找对应排名的学生,可以再创建一个数组vice_rank,根据排名找学生的cur.并且这两个数据可以同时更新,对时间复杂度没有影响

int rank_list[10010];//rank[i] = j 表明对于cur为i 的排名是 j
int vice_rank[10010]; // ran[j]= i 表明当前排名对应的cur

rank_list[i] = j;
vice_rank[j] = i;

好的思路

这道题有学长的提示,对于这种多次的更新查重操作,我们可以用vector来存放数据,用vector中的下标(cur)代表对应的数据,用map的映射来存放name和cur的对应关系,利用set的有序性来存放cur和其中数据的对应关系,而通过重写CMP,我也实现了通过下标直接找到vector中元素进行set的排序(有点绕,不知道自己以后能不能看懂)。但是这一次map不需要有序性,学长也提到了unordered_map,不进行排序,下次可以尝试。

//list时vector类型的数据,score是其中的数组
struct CMP
{
  bool operator() (int const& a, int const& b) const {
    if (list[a].avg != list[b].avg)
    {
      return list[a].avg > list[b].avg;
    }
    for (int i = 0; i < 9; i++)
    {
      if (list[a].score[i] == list[b].score[i])
      {
        continue;
      }
      else
      {
        return list[a].score[i] > list[b].score[i];
      }

    }
    return list[a].name < list[b].name;
  }
};
posted @ 2024-10-19 23:18  FFEE  阅读(1)  评论(0编辑  收藏  举报