8 条题解

  • 11
    @ 2023-7-15 20:48:39

    第一次写题解,我一个第四单元都还没上完的写完这题实属不易。 代码写的不好,但至少AC了。解析在注释中。

        int n,b[201]={0},num=1,biao=0,biao2,zhong2;
        string a[201]={"0"},x,zhong1;
        for (int i=1;i<=5;i++)
        {
            cin>>n;//输入后边通过人的数量。
            for (int i2=1;i2<=n;i2++)
            {
                biao=0;//一个标记变量。
                cin>>x;
                if (i2>5)
                {
                    continue;
                }//如果排名大于五就不记分,那我还运行后面的代码干啥。
                for (int i3=1;i3<num;i3++)//在数组a中搜寻这个人的名字是否存在。
                {
                    if (a[i3]==x)
                    {
                        biao=1;
                        biao2=i3;
                        break;
                    }//如果存在就标记一下,变量biao2记录他的下标。
                }
                if (biao==1)
                {
                    if (i2==1)
                    {
                        b[biao2]+=5;
                    }
                    else if (i2==2)
                    {
                        b[biao2]+=3;
                    }
                    else if (i2>=3 && i2<=5)
                    {
                        b[biao2]+=1;
                    }
                }//下标是一则直接判断是第几个,从而统计分数。
                if (biao==0)
                {
                    a[num]=x;
                    if (i2==1)
                    {
                        b[num]+=5;
                    }
                    else if (i2==2)
                    {
                        b[num]+=3;
                    }
                    else if (i2>=3 && i2<=5)
                    {
                        b[num]+=1;
                    }
                    num++;
                }//下标不是一则先记录在数组a中,再判断是第几个,从而统计分数(num是指a数组用到了第几个,方便操作)。
            }
        }//输入数据,并进行相应的计分。
        //现在开始排序。(因为数少,用冒泡排序)
        for (int i=1;i<num;i++)
        {
            for (int i2=2;i2<num;i2++)
            {
                if (b[i2-1]<b[i2])
                {
                    zhong1=a[i2-1];
                    a[i2-1]=a[i2];
                    a[i2]=zhong1;//将名字交换。
                    zhong2=b[i2-1];
                    b[i2-1]=b[i2];
                    b[i2]=zhong2;//将相应的分数也交换。
                }
                else if (b[i2-1]==b[i2])
                {
                    if (a[i2-1]>a[i2])
                    {
                        zhong1=a[i2-1];
                        a[i2-1]=a[i2];
                        a[i2]=zhong1;//将名字交换。
                        zhong2=b[i2-1];
                        b[i2-1]=b[i2];
                        b[i2]=zhong2;//将相应的分数也交换。
                    }
                }
            }
        }//排序结束。
        for (int i=1;i<num;i++)
        {
            if (b[i]==0)
            {
                break;
            }
            cout<<a[i]<<" "<<b[i]<<endl;
        }//输出结果。
        return 0;
    

    这些就是主体代码了(解析在注释中)。

    • 8
      @ 2022-8-3 21:16:52

      满分做法 - 样例平均用时2ms
      本题虽然难度只有4,但是涉及内容比较复杂导致尝试的人数比较少。
      我用的是结构体的知识。
      对于 100% 的数据, 1≤k≤200,输入的天数只有5天,所以最多可能出现的不同人名为200*5=1000个,保险起见我们可以把结构体的长度设置成1000以上的数。

      short k;
      int cnt,maxCnt;
      string s,nu;
      struct students
      {
          string name;
          int score;
      }Students[2000];
      

      cnt的作用是记录遍历到了Students的第几个元素,便于新数据的存入。
      maxCnt的作用是记录总共存入了多少个不同的人名。
      s的所用是临时读入一个字符串,nu的作用是作为一个空字符串作判定用。
      name用来记录名字,score用来记录积分。

      由于最后需要按照字典排序,所以还要提前写好一个比较函数,配合sort使用。

      bool cmp(const students x, const students y) {
          if (x.score > y.score) {
              return 1;
          }
          else if (x.score == y.score) {
              return x.name < y.name;
          }
          return 0;
      }
      

      按积分从大到小排序,积分相同的按名字字典序从小到大排序。

      过多的不作阐述,请看下方main中的代码。

          for (short i = 0; i < 5; i++) { // 共5天,循环5次
              cin >> k; // 输入k
              for (short j = 0; j < k; j++) { // k人,循环k次
                  cin >> s; // 临时读入一个字符串
                  cnt = 0; // 从下标0开始计数
                  short x=0; // 判断第j个完成题目的人可以获得多少分,默认0分
                  if (j == 0) {
                      x = 5;
                  }
                  else if (j == 1) {
                      x = 3;
                  }
                  else if (j > 1 && j < 5) {
                      x = 1;
                  }
                  while (1) { // 循环直到存入数据
                      if (Students[cnt].name == s) { // 已经存入过这个同学的数据
                          Students[cnt].score += x; // 直接增加积分
                          break; // 退出循环
                      }
                      else if (Students[cnt].name == nu) { // 没有存入过,字符串为空
                          Students[cnt].name = s; // 存入名字
                          Students[cnt].score += x; // 增加积分
                          break;
                      }
                      else {
                          cnt++; // 该位置已经存入了一个其他同学的数据,查找下一个位置
                      }
                  }
                  maxCnt = max(maxCnt, cnt); // 记录总共存入了多少个不同的人名
              }
          }
          sort(Students, Students + maxCnt + 1, cmp); // 按照字典排序
          for (short i = 0; i < 2000; i++) {
              cout << Students[i].name << " " << Students[i].score << "\n";
              if (Students[i + 1].score == 0) { // 当下一个位置的同学得分为0时,结束程序
                  break;
              }
          }
          ```
      • 4
        @ 2023-10-18 18:42:59

        第一次写题解,注释在代码里【别想ctrl + c然后ctrl + v噢】( ̄︶ ̄)↗

        int t = 1, d[205] = {0, 5, 3, 1, 1, 1}; //负责累加积分的数组
        
        struct T
        {
            int num;  // 积分统计
            string s;   //名字
        } a[10005];
        bool cmp(T x, T y) //如果积分相同就按字典序排序 否则就按积分排序
        {
            if (x.num == y.num) return x.s < y.s;
            else return x.num > y.num;
        }
        

        int main(){

        memset(d + 6, 0, sizeof(d) - 6 * sizeof(int)); //防止越界全初始化为0
        for (int i = 1; i <= 5; i++)
        {
            int x;
            cin >> x;
            for (int j = 1; j <= x; j++)
            {
                string s;
                cin >> s;
                bool flag = 1;
                for (int k = 1; k <= t; k++) //循环查找是否记录过
                {
                    if (a[k].s == s)
                    {
                        a[k].num += d[j]; //如果有就加上
                        flag = 0;
                    }
                }
                if (flag) //否则就新建一个
                {
                    a[++t].s = s;
                    a[t].num = d[j];
                }
            }
        }
        sort(a + 1, a + t + 1, cmp);
        for (int i = 1; i <= t; i++)
        {
            if (a[i].num) cout << a[i].s << ' ' <<a[i].num << '\n';
        }
        return 0;
        

        }

        • 3
          @ 2024-4-10 21:13:48

          AC做法

          思路

          首先输入每一天的人数和名字,查询每一个名字是否存在。如果不存在,就创建一个,并加上他的分数。如果存在,则直接加上分数。最后用sort排序,输出所有分数大于零的人。 (我是用一个数组存储要加的分数,所以每次加分时要判断是不是前五名)

          #include<bits/stdc++.h>
          using namespace std;
          struct T{
              string id;//名称
              int sum;//分数
          }a[100005];
          int n,k,b[6]={0,5,3,1,1,1};//n为每一天的人数,k是总共人数,b数组是每个名次要加的分数
          bool cmp(T a,T b){//排序规则
              if(a.sum!=b.sum){//比较分数
                  return a.sum>b.sum;
              }
              return a.id<b.id;//分数相同时比较字典序
          }
          int main(){
              for(int i=1;i<=5;i++){
                  cin>>n;
                  for(int j=1;j<=n;j++){
                      string s;
                      cin>>s;
                      bool flag=true;//如果为假,就是查到了
                      for(int q=1;q<=k;q++){//枚举所有人
                          if(a[q].id==s){
                              if(j<=5){
                                  a[q].sum+=b[j];
                              }
                              flag=false;
                              break;
                          }
                      }
                      if(flag){//没查到
                          a[++k].id=s;//创建
                          if(j<=5){
                              a[k].sum+=b[j];
                          }
                      }
                  }
              }
              sort(a+1,a+k+1,cmp);//排序
              for(int i=1;i<=k;i++){
                  if(a[i].sum!=0){
                      cout<<a[i].id<<" "<<a[i].sum<<endl;
                  }
              }
          }
          

          看到这里,觉得好就点个赞吧!

          • -1
            @ 2022-8-28 17:25:00
            struct hh
            {
                string name;
                int x;
            }a[2000];
            int awa(int xx)
            {
                if (xx==1)
                {
                    return 5;
                }
                else if (xx==2)
                {
                    return 3;
                }
                else
                {
                    return 1;
                }
            }
            bool cmp(hh x1,hh x2)
            {
                if (x1.x==x2.x)
                {
                    return x1.name<x2.name;
                }
                return x1.x>x2.x;
            }
            int k,h=0;
            string s;
            for (int i=1;i<=5;i++)
            {
                cin>>k;
                for (int j=1;j<=k;j++)
                {
                    cin>>s;
                    if (j<=5)
                    {
                        bool tf=1;
                        for (int w=1;w<=h;w++)
                        {
                            if (a[w].name==s)
                            {
                                tf=0;
                                a[w].x+=awa(j);
                                break;
                            }
                        }
                        if (tf)
                        {
                            a[++h].name=s;
                            a[h].x+=awa(j);
                        }
                    }
                }
            }
            sort(a+1,a+h+1,cmp);
            
            • -17
              @ 2023-2-6 15:31:44

              写题解请注意

              鼓励大家写题解,但注意题解格式。

              题解一定要有思路解析或代码注释,能否让别人理解你的思路

              也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

              给代码两端加上这个会舒服一些

              ```cpp

              你的代码

              ```

              </span>

              这个点在键盘的左上角tab上面那个键,注意切换输入法

              #include<iostream>
              using namespace std;
              int main()
              {
                  int n;
                  cin>>n;//这是一个注释
                  return 0;
              }
              

              请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

              抄袭题解一经发现直接取消成绩。

              题解被删除的可能

              1. 代码不符合格式规范
              2. 没有思路讲解或者没有注释,
              3. 无意义的题解

              大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

              • -17
                @ 2022-4-24 16:53:23

                写题解请注意

                鼓励大家写题解,但注意题解格式。

                题解一定要有思路解析或代码注释,能否让别人理解你的思路

                也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

                给代码两端加上这个会舒服一些

                ```cpp

                你的代码

                ```

                </span>

                这个点在键盘的左上角tab上面那个键,注意切换输入法

                #include<iostream>
                using namespace std;
                int main()
                {
                    int n;
                    cin>>n;//这是一个注释
                    return 0;
                } 
                

                请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                抄袭题解一经发现直接取消成绩。

                题解被删除的可能

                1. 代码不符合格式规范
                2. 没有思路讲解或者没有注释,
                3. 无意义的题解

                大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

                • -27
                  @ 2022-10-6 15:26:21
                  • [ ] *
                  • 1

                  信息

                  ID
                  1195
                  时间
                  1000ms
                  内存
                  256MiB
                  难度
                  6
                  标签
                  递交数
                  658
                  已通过
                  223
                  上传者