6 条题解

  • 8
    @ 2023-7-27 15:51:36

    本题考察归并排序应用,注意使用结构体存储id和成绩,使用归并排序进行从大到小排序即可。

    参考代码
    struct T
    {
        int id,score;
    } a[100010], c[100010];
    
    while (i <= mid && j <= r)
        {
            if (a[i].score >= a[j].score)
            {
                c[k++] = a[i++];
            }
            else
            {
                c[k++] = a[j++];
            }
        }
    
    • 4
      @ 2024-3-23 18:41:42
      //这道题和L13-4的作业是类似滴~
      #include <iostream>
      #include <algorithm>
      using namespace std;
      int n; 
      struct Student{
          int id,c,x;
      }t[100005];
      int cmp(Student a,Student b){
          if(a.c!=b.c)
              return a.c>b.c; 
          return a.x<b.x;
      }//cmp函数排序
      int main(){
          cin>>n;
          for(int i=0;i<n;i++)
              cin>>t[i].id;
          for(int i=0;i<n;i++){
              cin>>t[i].c; 
              t[i].x=i;
          }
          sort(t,t+n,cmp);//sort要调用<algorithm>
          for(int i=0;i<n;i++)
              cout<<t[i].id<<" ";
          return 0;
      }//by hetao1285761
      
      • 4
        @ 2023-11-26 10:55:53

        原来代码:

        #include <bits/stdc++.h>
        using namespace std;
        int n;
        struct node
        {
            int id,fenshu,sb;
        }a[100001];
        bool cmp(node x,node y)
        {
            if(x.fenshu==y.fenshu)
            {
                return x.sb<y.sb;
            }
            return x.fenshu>y.fenshu;
        }
        int main()
        {
            // freopen("filename.in", "r", stdin);
            // freopen("filename.out", "w", stdout);
            cin>>n;
            for(int i=1;i<=n;i++)cin>>a[i].id,a[i].sb=i;
            for(int i=1;i<=n;i++)cin>>a[i].fenshu;
            sort(a+1,a+1+n,cmp);
            for(int i=1;i<=n;i++)cout<<a[i].id<<' ';
            return 0;
        }
        

        现在代码:

        
        #include<bits/stdc++.h>
        using namespace std;int n;struct node{int id,fenshu,sb;}a[100001];bool cmp(node x,node y){if(x.fenshu==y.fenshu){return x.sb<y.sb;}return x.fenshu>y.fenshu;}int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i].id,a[i].sb=i;for(int i=1;i<=n;i++)cin>>a[i].fenshu;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)cout<<a[i].id<<' ';return 0;}
        
        

        都以AC

        • 4
          @ 2023-9-5 20:04:58

          yasuo👀️

          #include <iostream>
          #include <algorithm>
          struct stu{int id,cj,order;}stud[100005];
          int yasuo(stu a,stu b){
              if(a.cj!=b.cj)return a.cj>b.cj; else return a.order<b.order;}
          int main(){
              int q; std::cin>>q;for(int i=0;i<q;i++)std::cin>>stud[i].id;
              for(int i=0;i<q;i++){std::cin>>stud[i].cj; stud[i].order=i;}
              std::sort(stud,stud+q,yasuo);
              for(int i=0;i<q;i++)std::cout<<stud[i].id<<" ";
              return 0;}
          
          • 4
            @ 2023-8-7 1:33:32

            这个问题的解决思路是使用自定义结构体,将每个人的学号、成绩和输入顺序组合在一起,并根据成绩从大到小以及输入顺序对学生进行排序。

            首先,我们定义一个结构体Student,其中包含三个成员变量:学号id、成绩score和输入顺序order

            接下来,我们读取输入的人数n。然后,创建一个长度为n的数组students,用于存储每个人的学号、成绩和输入顺序信息。我们使用两个循环分别读取学号和成绩,并将输入顺序记录在结构体的order成员中。

            随后,我们定义一个比较函数compare,用于对学生进行排序。在比较函数中,首先比较两个学生的成绩。如果成绩相同,我们按照输入顺序来确定排序。这样,我们可以保证在成绩相同时,按照输入的顺序排列。

            最后,我们使用std::sort函数对数组students进行排序,排序的依据是我们定义的compare函数。

            最终,通过循环遍历输出排序后的学号,即得到按照成绩从大到小排序,成绩相同时按输入顺序的输出结果。

            这个解决思路利用了自定义结构体和排序函数,可以灵活地根据题目要求进行排序操作。

            #include <iostream>
            #include <vector>
            #include <algorithm>
            
            struct Student {
                int id;
                int score;
                int order;
            };
            
            bool compare(const Student& a, const Student& b) {
                if (a.score == b.score) {
                    return a.order < b.order;
                }
                return a.score > b.score;
            }
            
            int main() {
                int n;
                std::cin >> n;
            
                std::vector<Student> students(n);
                for (int i = 0; i < n; ++i) {
                    std::cin >> students[i].id;
                }
            
                for (int i = 0; i < n; ++i) {
                    std::cin >> students[i].score;
                    students[i].order = i;
                }
            
                std::sort(students.begin(), students.end(), compare);
            
                for (int i = 0; i < n; ++i) {
                    std::cout << students[i].id << " ";
                }
                std::cout << std::endl;
            
                return 0;
            }
            
            • 2
              @ 2024-3-24 13:52:49
              题目描述(已更正)

              题目描述

              输入n个人的学号和成绩,按成绩从大到小输出每个人的学号,成绩相同时,按输入的顺序输出。

              输入格式

              第 1 行包含一个正整数 n,表示人数。第二行包括n个整数,表示第n个人的学号。第三行包括n个整数,表示第n个人的成绩

              此处描述和输入样例保持一致。可以AC

              输出格式

              1行,空格隔开的n个正整数,表示即排好序后的每个人的学号。

              思路分析

              读入基本数据之后,由于在两个成绩相等的人之中要先输出先输入的人,所以在结构体中记录一下输入的次序。(order中文释义有顺序的意思)然后使用归并排序根据编好的cmp函数排序,输出对应的id即可AC 注:本题与作业的相似度很高,所以我使用了经过爆改后的作业代码

              暴改代码
              #include <bits/stdc++.h>
              using namespace std; 
              int pl,pr,pc; 
              struct T 
              { 
              	int score,id,order; 
              }t[100005],c[100005];
              bool cmp(T x,T y)
              { 
              	if (x.score == y.score)
              	{ 
              		return x.order < y.order;
              	} 
              	return x.score > y.score;
              }
              void MergeSort(int l,int r) 
              { 	if (l == r) 
              	{ 
              		return; 
              	} 
              	int mid = (l+r)/2;
              	MergeSort(l,mid);
              	MergeSort(mid+1,r);
              	pl = l; 
              	pr = mid+1;
              	pc = l;
              	while(pl <= mid && pr <= r)
              	{ 
              		if (cmp(t[pl],t[pr]))
              		{
              			c[pc++] = t[pl++]; 
              		} 
              		else 
              		{ 
              			c[pc++] = t[pr++]; 
              		} 
              	} 
              	while(pl <= mid) 
              	{ 
              		c[pc++] = t[pl++]; 
              	} 
              	while(pr <= r) 
              	{ 
              		c[pc++] = t[pr++]; 
              	} 
              	for (int i = l;i <= r;i++) 
              	{ 
              		t[i] = c[i]; 
              	} 
              } 
              int main() 
              { 
              	int n; 
              	cin >> n; 
              	for (int i = 1;i <= n;i++) 
              	{ 
              		cin >> t[i].id;
              		t[i].order = i;
              	}
              	for (int i = 1;i <= n;i++)
              	{
              		cin >> t[i].score;
              	}
              	MergeSort(1, n); 
              	for (int i = 1;i <= n;i++) 
              	{ 
              		cout << t[i].id << " "; 
              	} 
              	return 0; 
              }
              

              别忘点赞支持一下

              • 1

              信息

              ID
              359
              时间
              1000ms
              内存
              256MiB
              难度
              2
              标签
              (无)
              递交数
              415
              已通过
              261
              上传者