6 条题解
-
4
//这道题和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
原来代码:
#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
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
这个问题的解决思路是使用自定义结构体,将每个人的学号、成绩和输入顺序组合在一起,并根据成绩从大到小以及输入顺序对学生进行排序。
首先,我们定义一个结构体
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
题目描述(已更正)
题目描述
输入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
- 上传者