9 条题解
-
10
本蒟蒻还没有熟练掌握结构体所以 · · · · · · 就五个数组!
上代码!!!(后面有极简代码)
AC代码(数组)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int x[n], y[n], z[n], all[n], num[n]; for (int i = 0; i < n; i++) { cin >> x[i] >> y[i] >> z[i]; all[i] = x[i] + y[i] + z[i]; num[i] = i; } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1; j++) { if (all[j] < all[j + 1]) { swap(all[j], all[j + 1]); swap(x[j], x[j + 1]); swap(num[j], num[j+1]); } else if (all[j] == all[j + 1] && x[j] < x[j + 1]) { swap(all[j], all[j + 1]); swap(num[j], num[j + 1]); swap(x[j], x[j + 1]); } else if (all[j] == all[j + 1] && x[j] == x[j + 1] && num[j] > num[j + 1]) { swap(all[j], all[j + 1]); swap(num[j], num[j + 1]); swap(x[j], x[j + 1]); } } } for (int i = 0; i < 5; i++) { printf("%d %d\n", num[i] + 1, all[i]); } return 0; }
附极简AC代码
#include <bits/stdc++.h> using namespace std; int main() { int n, x, y, z, p[310]; cin >> n; for (int i = 1; i <= n; i++) { cin >> x >> y >> z; p[i] = (x + y + z) * 1000000 + x * 1000 + 999 - i; } sort(p + 1, p + n + 1); for (int i = n; i >= n - 4; --i) cout << 999 - p[i] % 1000 << " " << p[i] / 1000000 << endl; return 0; }
点个赞吧!求求啦!
-
2
#挑战全网行数最少(5行)
#include <bits/stdc++.h> struct V {int id, a, b, c, d;}v[305]; bool cmp(V x, V y){if (x.d != y.d){return x.d > y.d;}else if (x.a != y.a){return x.a > y.a;} else {return x.id < y.id;}} int n; int main(){scanf("%d", &n);for (int i = 1;i <= n;i++){scanf("%d%d%d", &v[i].a, &v[i].b, &v[i].c);v[i].id = i, v[i].d = v[i].a + v[i].b + v[i].c;}std::sort(v + 1, v + n + 1, cmp);for (int i = 1;i <= n && i <= 5;i++) printf("%d %d\n", v[i].id, v[i].d);}
-
2
题解
这道题不是很难,乍一看排序很复杂,其实是一个结构体数组排序。会的一听就明白了,不会的完全不懂。 我这里就来解释一下,dalao可以直接跳过。
结构体,struct,就是指将一些变量和方法组合成一个整体,有些像一个类型,可以用它定义变量、数组,而且还可以访问数据和运行方法。有点像低配的class。class其实就是他的升级版,添加了公私(public, protected, private),还有继承、多态之类的类属性。
好像有点跑题了。这里就简单介绍一下。结构体做成的数组也是可以排序的,但是我们直接用sort肯定不行,因为我们的结构体没有小于号重载(就是通过形如operator <为名的函数,调用时可以把本对象和参数对象进行比较)或者定义cmp函数。一般来说cmp函数较为简单。
那么如何定义cmp函数呢?sort内核需要我们在需要交换元素(以冒泡排序理解一下,其实sort也有可能是别的 排序)时返回
0
,而不需要时返回1
,有些像我们自己写冒泡排序时的if (a[i] > a[j])
,通过这样可以改变排序的方向。这里题目要求:先按总分从高到低排序,如果两个同学总分相同,…………
先看到这里,总分可以在结构体里定义,除了记录三科成绩 ,还要记录总分 。
struct student // 终于出现代码了 { int a, b, c, sum; // 其中的变量 // 还可能在这里有些函数 }; // 注意struct, union, class这里有个分号 bool cmp(student a, student b) // 注意格式 { return a.sum > b.sum; // 这里比较巧妙,如果a总分大于b,确实不用交换a、b,反之亦然 }
接着看:…………再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,…………
停停停,这里说需要语文成绩,结构体里有 ,再看 函数。
struct student { int a, b, c, sum; }; // 注意分号 bool cmp(student a, student b) { if (a.sum == b.sum) // 只有在相等时才进入if { return a.a > b.a; // 这个和下面有些类似,语文成绩a比b好,就不必交换,这里前提是a、b总分相同 } return a.sum > b.sum; }
最后是:…………那么规定学号小的同学排在前面。
后面的不要了。我们还需要学号,我们可以在结构体里加一个 。 里在 时就根据学号排序。
struct student { int id, a, b, c, sum; }; // 注意分号 bool cmp(student a, student b) { if (a.sum == b.sum) { if (a.a == b.a) return a.id < b.id; // 这里用小于号,因为学号按小到大排序 return a.a > b.a; } return a.sum > b.sum; }
那这个就差不多了,接下来就是输入输出。
#include <bits/stdc++.h> using namespace std; int n, a, b, c; struct student { int id, a, b, c, sum; } s[305]; // 可以在这里直接定义结构体变量 bool cmp(student a, student b) { if (a.sum == b.sum) { if (a.a == b.a) return a.id < b.id; return a.a > b.a; } return a.sum > b.sum; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d%d", &a, &b, &c); s[i].id = i; s[i].a = a; s[i].b = b; s[i].c = c; s[i].sum = a + b + c; // 提前计算 } sort(s + 1, s + n + 1, cmp); // 排序 for (int i = 1; i <= 5; i++) { printf("%d %d\n", s[i].id, s[i].sum); } return 0; }
这里再吐槽一句,他说了 ,也没说 ,所以说有可能 小于 ,如果数组越界就 RE 了。所以这里我循环写的是:
for (int i = 1; i <= min(5, n); i++)
这样不会越界,但是输出题目里说:
共 行,每行是两个用空格隔开的正整数,依次表示前 名学生的学号和总分。
行???
而且
i <= 5
对了!为此,我只能说:数据太弱了啊!!!
不过在考场上,建议大家谨慎行事。
不过题目不都是被审核的吗?哪里会出现这种情况?#include <bits/stdc++.h> using namespace std; int n, a, b, c; struct student { int id, a, b, c, sum; } s[305]; bool cmp(student a, student b) { if (a.sum == b.sum) { if (a.a == b.a) return a.id < b.id; return a.a > b.a; } return a.sum > b.sum; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d%d", &a, &b, &c); s[i].id = i; s[i].a = a; s[i].b = b; s[i].c = c; s[i].sum = a + b + c; } sort(s + 1, s + n + 1, cmp); for (int i = 1; i <= 5; i++) { printf("%d %d\n", s[i].id, s[i].sum); } return 0; }
-
1
根据题目所说排序并输出即可
struct h { int x,y,z,sum,m; }a[500]; bool cmp(h x1,h x2) { if (x1.sum==x2.sum) { if (x1.x==x2.x) { return x1.m<x2.m; } else { return x1.x>x2.x; } } else { return x1.sum>x2.sum; } } for (int i=1;i<=n;i++) { cin>>a[i].x>>a[i].y>>a[i].z; a[i].m=i; a[i].sum=a[i].x+a[i].y+a[i].z; } sort(a+1,a+n+1,cmp); for (int i=1;i<=5;i++) { cout<<a[i].m<<" "<<a[i].sum<<'\n'; }
-
0
结构体&&排序
学过结构体排序的跳过
结构体:
将一个变量或多个变量存在一个数据结构中(变量可以不同类型)
定义结构体:struct{};
排序:
将一个数列按升序(降序)排序
常见函数:sort(起始地址,终止地址);
</cpp>#include <bits/stdc++.h> using namespace std; int n; struct Sum{ int c,m,e,sum=0,pos; }ans[310]; bool cmp(Sum x,Sum y){ if (x.sum==y.sum){ if (x.c==y.c)return x.pos<y.pos; else return x.c>y.c; } return x.sum>y.sum; } int main(){ cin>>n; for (int i=1;i<=n;i++){ cin>>ans[i].c>>ans[i].m>>ans[i].e; ans[i].sum+=ans[i].c+ans[i].m+ans[i].e; ans[i].pos=i; } sort(ans+1,ans+1+n,cmp); for (int i=1;i<=5;i++)cout<<ans[i].pos<<" "<<ans[i].sum<<endl; return 0; }
-
0
这题目很简单,不过要说一个知识点:结构体(struct)。
结构体是什么???他其实是像int,long long,string,bool,double等等这样的数据类型中最特殊的一个,应为我可以自己定义一个数据类型,比如:
struct node { }x;
这个代表我定义了个node类型的变量x。
知道了结构体是什么后,这道题就很简单了。
AC答案:
#include <bits/stdc++.h> using namespace std; struct node { int id; //id是学号 int x; //x是语文 int y; //y是数学 int z; //z是英语 }a[1001]; //定义了一个node类型的数组 int n; //有多少学生 bool cmp(node q,node w) //排序时要用到 { int r=q.x+q.y+q.z; //先加总分,后面判断就不用那么麻烦了 int s=w.x+w.y+w.z; if(r!=s)return r>s; //如果总分不相等就返回大的那个 else if(q.x!=w.x)return q.x>w.x; //如果语文分不相等就返回语文分大的那个 else return q.id<w.id; //这个不用我说了 } int main() { cin>>n; for(int i=1;i<=n;i++) { a[i].id=i; //将此时的编号(i)给a[i].id,因为后面排序要用 cin>>a[i].x; //输入语文分数 cin>>a[i].y; //输入数学分数 cin>>a[i].z; //输入英语分数 } sort(a+1,a+1+n,cmp); //用sort简单明了 if(n<=5) //分类讨论输出 { for(int i=1;i<=n;i++) { cout<<a[i].id<<' '<<a[i].x+a[i].y+a[i].z<<endl; } } else { for(int i=1;i<=5;i++) { cout<<a[i].id<<' '<<a[i].x+a[i].y+a[i].z<<endl; } } return 0; }
-
0
#include<bits/stdc++.h> using namespace std; struct f{ int xh; int yw; int sx; int yy; int zf; };//定义一个结构体,分别存储所有成绩。 bool cmp(f a,f b) { if(a.zf==b.zf) { if(a.yw==b.yw) { return a.xh>b.xh; } return a.yw<b.yw; } return a.zf<b.zf; }//这一段函数是重点,进行判断,再交换两者,进行结构体的排序。 f a[100000];//数据范围要注意一下 int main(){ int n; cin>>n; for(int i=1;i<=n;i++) { a[i].xh=i; cin>>a[i].yw>>a[i].sx>>a[i].yy; a[i].zf=a[i].yw+a[i].sx+a[i].yy; } sort(a+1,a+n+1,cmp);//使用快排,简单明了 for(int i=n;i>n-5;i--) { cout<<a[i].xh<<' '<<a[i].zf<<endl; }//输出 return 0;//养成好习惯 } //其实,这段代码还可以进行优化,可以在结构体内不定义数学成绩和英语成绩,直接算入总分,会使时间复杂度稍微少一些,就留给你们进行探索啦,上面的代码可以A哦。
-
0
简单的结构体排序,按照题目意思进行模拟即可。
#include <cstdio> //printf #include <algorithm> //sort #define maxn 305 using namespace std; int n; inline int read(){ //快读 int x = 0 , f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } return x * f; } struct QWQ{ //学生 int a , b , c , id , zf; //语文,数学,英语,输入顺序,三课总分 void qwq_read(int i){ a = read(); b = read(); c = read(); id = i; zf = a + b + c; } }qwq[maxn]; bool cmp(QWQ a , QWQ b){ //比较 if(a.zf == b.zf){ if(a.a == b.a) return a.id < b.id; else return a.a > b.a; } return a.zf > b.zf; } int main(){ n = read(); for(int i = 1;i <= n;i++) qwq[i].qwq_read(i); sort(qwq + 1 , qwq + n + 1 , cmp); //排序 for(int i = 1;i <= 5;i++) printf("%d %d\n" , qwq[i].id , qwq[i].zf); }
- 1
信息
- ID
- 1137
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 704
- 已通过
- 325
- 上传者