15 条题解

  • 10
    @ 2023-4-29 9:14:37

    P1026 谁考了第k名

    题目描述

    在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。


    思路

    结构体部分:

    学生的学号和他的成绩两个量,也就是一个int一个double,再定义一个a[105]就可以了。

    struct Student
    {
        int id;
        double ach;
    }a[105];
    

    比较部分:

    bool形式,返回是否符合x学生成绩 > y学生成绩。

    bool cmp(Student x,Student y)
    {
        return x.ach > y.ach;
    }
    

    把他们整合起来,使用 sort(a + 1,a + n + 1,cmp)排序,最后输出第k位相关数据就可以了。


    参考代码

    #include <iostream>//hetao3097453
    #include <algorithm>
    using namespace std;
    struct Student
    {
        int id;
        double ach;
    }a[105];
    bool cmp(Student x,Student y)
    {
        return x.ach > y.ach;
    }
    int main()
    {
        int n,k;
        cin >> n >> k;
        for(int i = 1;i <= n;i++)
        {
            cin >> a[i].id >> a[i].ach;
        }
        sort(a + 1,a + n + 1,cmp);
        cout << a[k].id << " " << a[k].ach;
        return 0;
    }
    
    

    hetao3097453

    2023年4月29日

  • 9
    @ 2023-8-5 21:22:13

    思路

    首先是结构体,可以看作一个新种变量同时可以储存多个变量,这里我用int记录学号,double记录分数

    struct info{
        int num;
        double mark;
    }f[105];//建立了一个info类型的数组f,可以同时储存int和double
    

    然后输入。这里记住,调用结构体变量要用成员运算符

    for(int i=1;i<=n;i++)cin>>f[i].num>>f[i].mark;//点是调用此结构体变量中储存的变量
    

    最后排序。我用了快排,排序自选,不过不推荐冒排和插排,因为时间复杂度太高了

    void quicksort(int l,int r){
        int i=l,j=r;
        if(l>=r)return;//递归边界。当l==r时,此元素已排好;当l>r时,出错结束
        while(i!=j){
            while(f[i].mark>=f[r].mark&&i<j)i++;//要对比mark,直接对比会出错
            while(f[j].mark<=f[r].mark&&i<j)j--;
            if(i<j)swap(f[i],f[j]);//可以直接交换
        }
        swap(f[r],f[i]);
        quicksort(l,i-1);//递归
        quicksort(i+1,r);//递归
    }
    

    最后是

    代码!!!(已AC)

    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct info{
        int num;
        double mark;
    }f[105];
    void quicksort(int l,int r){
        int i=l,j=r;
        if(l>=r)return;
        while(i!=j){
            while(f[i].mark>=f[r].mark&&i<j)i++;
            while(f[j].mark<=f[r].mark&&i<j)j--;
            if(i<j)swap(f[i],f[j]);
        }
        swap(f[r],f[i]);
        quicksort(l,i-1);
        quicksort(i+1,r);
    }
    int main(){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)cin>>f[i].num>>f[i].mark;
        quicksort(1,n);
        cout<<f[k].num<<' '<<f[k].mark<<endl;
        return 0;
    }
    

    (点赞抱走)

    • @ 2024-6-15 11:12:30

      改进一下(颜色太单调了)

      #include <bits/stdc++.h>//万能头
      using namespace std;//hetao1136081
      struct info{
          int num;
          double mark;
      }f[105];
      void quicksort(int l,int r){
          int i=l,j=r;
          if(l>=r)return;
          while(i!=j){
              while(f[i].mark>=f[r].mark&&i<j)i++;
              while(f[j].mark<=f[r].mark&&i<j)j--;
              if(i<j)swap(f[i],f[j]);
          }
          swap(f[r],f[i]);
          quicksort(l,i-1);
          quicksort(i+1,r);
      }
      int main(){
          int n,k;
          cin>>n>>k;
          for(int i=1;i<=n;i++)cin>>f[i].num>>f[i].mark;
          quicksort(1,n);
          cout<<f[k].num<<' '<<f[k].mark<<endl;
          return 0;
      }
      
      </span>
    • @ 2024-6-16 17:29:53

      用比较函数和sort结合在一起更好,代码更简洁,准确率更高。

  • 2
    @ 2023-10-6 14:05:00

    难度:一般 难点:结构体排序 等级考试二级真题 代码:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n, m;
    struct Student
    {
    int id;
    double chengji;
    }s[1000];
    bool cmp(Student s1, Student s2)
    {
    return s1.chengji > s2.chengji;
    }
    int main()
    {
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
    cin >> s[i].id >> s[i].chengji;
    }
    sort(s, s + n + 1, cmp);
    cout << s[m - 1].id << " " << s[m - 1].chengji;
    return 0;
    }
    

    制作不易,给个赞吧😄

    • 0
      @ 2024-4-21 21:31:46

      题目描述

      在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。

      其实这道题和P1025类似,只是多添加了一个判断if (i == k)的过程,可以在源代码的基础上添加即可.

      上判断代码的截图:

      image

      此题先定义名为Student的结构体,再定义n,k,后写判断:

      image

      接下来的主代码即在上方第一张图片.

      总代码:

      image

      接下来是Visual运行后的结果:

      image

      递交后结果是100%AC的:

      image

      最后是AC代码,请勿一次性粘贴吞食,否则会被封号关进小黑屋[doge]

      代码

      下载

      #include <bits/stdc++.h> //by Zhao
      using namespace std;
      //结构体的定义
      struct Student
      {
      	int id;
      	double score; 
      } s[10086];
      //定义整数型变量 
      int n,k;
      //书写判断代码,注意x.score的判断!!! 
      bool cmp(Student x,Student y)
      {
      	if (x.score == y.score) //判断分数相同时小号在前大号在后 
      		return x.id < y.id;
      	return x.score > y.score;
      }
      //主函数 
      int main()
      {
      	cin >> n >> k; //写入人数及成绩排名第k名的学生 
      	for (int i = 1;i <= n;i++)
      		cin >> s[i].id >> s[i].score;
      	sort(s + 1,s + n + 1,cmp);
      	for (int i = 1;i <= n;i++)
      	{
      		if (i == k) //检验及输出要求的值 
      			cout << s[i].id << " " << s[i].score << endl;
      	}
      	return 0;
      }
      
      点个赞就可以抱走,感谢😄 
      
      • 0
        @ 2023-7-22 19:58:34

        题解 先来定义一个结构体

        struct stu
        {
            int id;
            double m;
        }s[1001];
        

        接着是cmp函数

        bool cmp(stu x,stu y)
        {
            return x.m>y.m;
        }
        

        然后就输入,排个序,输出。

        cin>>n>>k;
            for (int i=1;i<=n;i++)
                cin>>s[i].id>>s[i].m;
            sort(s+1,s+n+1,cmp);
            cout<<s[k].id<<" "<<s[k].m;
        

        完整代码

        #include <bits/stdc++.h>//hetao3222569
        using namespace std;
        struct stu
        {
            int id;
            double m;
        }s[1001];
        int n,k;
        bool cmp(stu x,stu y)
        {
            return x.m>y.m;
        }
        int main()
        {
            cin>>n>>k;
            for (int i=1;i<=n;i++)
                cin>>s[i].id>>s[i].m;
            sort(s+1,s+n+1,cmp);
            cout<<s[k].id<<" "<<s[k].m;
            return 0;
        } 
        
        • 0
          @ 2023-7-17 9:14:24
          #include <iostream>
          using namespace std;
          int main()
          {
              double n,k,m=-1;
              cin>>n>>k;
              double c[300];
              long long x[300];
              for (int i=0;i<=n-1;i++)
              {
                  cin>>x[i];
                  cin>>c[i];
              }
              for (int j=1;j<=k-1;j++)
              {
                  m=-1;
                  for (int q=0;q<=n-1;q++)
                  {
                      if (c[q]>m)
                          m=c[q];
                  }
                  for (int f=0;f<=n-1;f++)
                  {
                      if (c[f]==m)
                          c[f]=-9;
                  }
              }
              m=-1;
              for (int i=0;i<=n-1;i++)
              {
                  
                  if (c[i]>m)
                      m=c[i];
              }
              int pos;
              for (int i=0;i<=n-1;i++)
              {
                  if (c[i]==m)
                      pos=i;
              }
              cout<<x[pos]<<" "<<m;
              return 0;
          }//方法复杂了亿点点……
          
          • 0
            @ 2023-4-29 19:16:43

            思路:定义一个struct,然后排序

            代码:

            #include <bits/stdc++.h>
            
            using namespace std;
            
            struct Stu {
                // 学号和成绩
                int id;
                float sc;
            } s[1000];
            int n, k;
            
            bool cmp(Stu x, Stu y) {
                return x.sc > y.sc;
            }
            
            int main() {
                cin >> n >> k;
                for (int i = 0; i < n; i++)
                    cin >> s[i].id >> s[i].sc;
                sort(s, s + n, cmp);
                cout << s[k - 1].id << " " << s[k - 1].sc << endl;
                return 0;
            }
            
            • 0
              @ 2023-2-28 15:55:03

              定义结构体,包含学号(int类型)和成绩(double类型),并定义cmp函数,按题目要求排序即可。

              代码
              
              #include<bits/stdc++.h>
              
              using namespace std;
              struct S { int id; double m; } s[101];
              int n, k;
              bool cmp(S x, S y) { return x.m > y.m; }
              int main() { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%d%lf", &s[i].id, &s[i].m); sort(s + 1, s + n + 1, cmp); cout << s[k].id << " " << s[k].m;
              return 0; }
              • -1
                @ 2023-9-5 19:10:02

                yasuo👀️

                #include <iostream>
                #include <algorithm>
                struct stu{int id;float cj;}stud[105];
                bool yasuo(stu x,stu y){
                    if(x.cj!=y.cj)return x.cj>y.cj;
                    return x.id<y.id;}
                int main(){
                    int n,m;std::cin>>n>>m; for(int i=0;i<n;i++)std::cin>>stud[i].id>>stud[i].cj;
                    std::sort(stud,stud+n,yasuo);
                    std::cout<<stud[m-1].id<<" "<<stud[m-1].cj<<"\n"; return 0;}
                
                • -1
                  @ 2023-8-31 21:14:58
                  #include<bits/stdc++.h>
                  using namespace std;
                  int n,k;
                  struct b
                  {
                      string num;
                      double c;
                  }q[105];
                  bool cmp(b x,b y)
                  {
                      return x.c>y.c;
                  }
                  int main()
                  {
                      cin>>n>>k;
                      for(int i=1;i<=n;i++)cin>>q[i].num>>q[i].c;
                      sort(q+1,q+n+1,cmp);
                      cout<<q[k].num<<' '<<q[k].c;
                      return 0;
                  }
                  
                  • -1
                    @ 2023-7-29 10:47:48

                    运用我们学过的知识 struct 去做

                    下面是代码⬇️

                    #include <iostream>
                    #include <algorithm>
                    using namespace std;
                    
                    struct Student
                    {
                        double score;
                        long long id;
                    };
                    Student a[101];
                    
                    bool check(Student x,Student y)
                    {
                        return x.score > y.score;
                    }
                    
                    int main()
                    {
                        int n,k;
                        cin >> n >> k;
                        for(int i = 1;i <= n;i++)
                            cin >> a[i].id >> a[i].score;
                        sort(a+1,a+n+1,check);
                        cout << a[k].id << " " << a[k].score;
                        return 0;
                    }
                    4
                    
                    • -1
                      @ 2023-4-28 21:57:54
                      #include<bits/stdc++.h>//by Chris knowledge
                      using namespace std;
                      struct S {
                          int id;
                          double m;
                      } s[101];
                      int n, k;
                      bool cmp(S x, S y)
                      {
                          return x.m > y.m;
                      }
                      int main()
                      {
                          scanf("%d%d", &n, &k);
                          for (int i = 1; i <= n; i++)
                              scanf("%d%lf", &s[i].id, &s[i].m);
                          sort(s + 1, s + n + 1, cmp);
                          cout << s[k].id << " " <<  s[k].m;
                          return 0;
                      }
                      
                      • @ 2023-8-5 21:26:34

                        为什么我跟你一样用scanf,但我最后用printf("%d %f\n",a[k].num,a[k].mark而不是cout,WA了,查了一下mark保留了多位小数

                    • -3
                      @ 2024-1-6 19:37:54

                      简单 #include <iostream> #include <algorithm> using namespace std; struct Student{ int a; double b; } s[105]; int n,k; int cmp(Student x,Student y){ return x.b>y.b; } int main() { cin>>n>>k; for(int i = 1;i<=n;i++) { cin>>s[i].a>>s[i].b; } sort(s+1,s+n+1,cmp); cout<<s[k].a<<" "<<s[k].b; }

                      • -3
                        @ 2023-8-12 10:24:03

                        P1026

                        -题目回顾-

                        在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。


                        -分析-

                        重点:使用结构体,定义cmp函数

                        不要乱开doulble所以这里我选择使用float


                        -代码-

                        #include <bits/stdc++.h>//by AGOMG(hetao1193656)
                        using namespace std;
                        struct Student{
                            long id;
                            float grd;
                        }s[1005];
                        bool cmp(Student a, Student b){
                            return a.grd > b.grd;
                        }
                        int n, m;
                        int main()
                        {
                            cin >> n >> m;
                            for(int i = 1; i <= n; i++) cin >> s[i].id >> s[i].grd;
                            sort(s + 1, s + n + 1, cmp);
                            cout << s[m].id << ' ' << s[m].grd;
                            return 0;
                        }
                        
                        • -6
                          @ 2023-4-29 16:38:26

                          #include <iostream> #include <algorithm> using namespace std; struct Student { int id; double ach; }a[105]; bool cmp(Student x,Student y) { return x.ach > y.ach; } int main() { int n,k; cin >> n >> k; for(int i = 1;i <= n;i++) { cin >> a[i].id >> a[i].ach; } sort(a + 1,a + n + 1,cmp); cout << a[k].id << " " << a[k].ach; return 0; }

                          • @ 2023-4-29 19:17:21

                            试了,不彳亍,编译没通过。

                          • @ 2023-8-5 21:24:02

                            请格式化一下 压缩版也可以

                        • 1

                        信息

                        ID
                        19
                        时间
                        1000ms
                        内存
                        256MiB
                        难度
                        3
                        标签
                        递交数
                        2008
                        已通过
                        1015
                        上传者