解题思路:
注意事项:
参考代码:
提供一种简洁的比较函数。
struct stu{ int chi,math,eng,tot,rank;//语数外,总分,号码}a[1001];bool cmp(stu a,stu b){ if(a.tot!=b.tot)return a.tot>b.tot; if(a.chi!=b.chi)return a.chi>b.chi;//直接用c++的比较符号返回布尔值的特性编写,看起来易懂简洁
else return a.rank<b.rank; return 0;
}
不上代码啦!^_^
评论
还没有评论
评论
核心思路:用结构体储存数据,c++自带的sort函数来进行多元素快排(这就是c++的好用之处了(划掉))。
不多说,具体看代码。
#include<cstdio>#include<algorithm>using namespace std;struct sco{ int c,s,id; //因为比较的时候只需要总分、学号、语文成绩这三个元素,所以数学和英语可以不用储存 }a[302];
bool cmp(sco x,sco y){ return x.s!=y.s?x.s>y.s:(x.c!=y.c?x.c>y.c:x.id<y.id);
/*用到了条件运算符 a?b:c的意思是,如果a的值为true,那么返回b值,否则返回c值 所以这句代码的意思是,如果总分不相等,那么假如前面的总分大于后面就不交换,否则交换
如果相等,那么再看语文成绩相不相等,如果不相等一样是大于不交换,小于等于交换
如果语文成绩还相等那么就看学号的关系,大了交换,小了不交换*/
}int main(){ //这道题如果手打快排太麻烦(因为本蒟蒻不会手打三元素快排),直接用的stl美滋滋
//想通了之后也是非常简单的模拟题
int n,score[3];//用score数组来储存语文数学英语成绩,而储存结构体的时候只需要语文和总分学号就ok
scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&score[0],&score[1],&score[2]);
a[i].id=i;a[i].c=score[0];a[i].s=score[0]+score[1]+score[2]; //结构体储存信息
}
sort(a+1,a+1+n,cmp);//stl快排
//排完之后所有学生的顺序就和题意一样啦
for(int i=1;i<=5;i++)printf("%d %d\n",a[i].id,a[i].s);//输出前5位同学的学号和总分
return 0;
}
评论
还没有评论
评论
一道很好的结构体训练题
我先说一句吧。。。赛场上一般都不手打排序的(C++),一般使用sort,但是sort对结构体的排序就比较麻烦了,需要自己编写一个函数cmp作为sort的第三个参数,具体为:
bool cmp(结构体名称 a,结构体名称 b){/*判断a是否大于b的代码块,如果a大于或等于b返回1,否则返回否*/}
那么我们先定义一个结构体stu:
struct stu
{ int num;//编号
int c,m,e; //分别表示Chinese,math和English的分数
int sum;//总分}student[310];//在此顺便定义数组
然后开始写cmp函数
bool cmp(stu a,stu b){ if(a.sum>b.sum) return 1;//总分大于b就返回1
else if(a.sum<b.sum) return 0;//否则返回0
else//相等
{ if(a.c>b.c) return 1;//比较语文
else if(a.c<b.c) return 0; else//语文也相等
{ if(a.num>b.num) return 0;//比较编号
else return 1;
}
}
}
完成了!
之后就可以用sort直接排序具体调用方式为
sort(student+1,student+1+n,cmp);
那么现在给出完整代码:
#include<iostream>#include<algorithm>using namespace std;struct stu
{ int num;//编号
int c,m,e;
int sum;
}student[310];bool cmp(stu a,stu b){ if(a.sum>b.sum) return 1; else if(a.sum<b.sum) return 0; else
{ if(a.c>b.c) return 1; else if(a.c<b.c) return 0; else
{ if(a.num>b.num) return 0; else return 1;
}
}
}int main(){ int n; cin>>n; for(int i=1;i<=n;i++)
{
student[i].num=i;//录入编号
cin>>student[i].c>>student[i].m>>student[i].e;//输入
student[i].sum=student[i].c+student[i].m+student[i].e;//计算总分
}
sort(student+1,student+1+n,cmp); for(int i=1;i<=5;i++) cout<<student[i].num<<' '<<student[i].sum<<endl; return 0;
}
评论
还没有评论
评论
这道题我的思路很简单,一遍AC,但是对于不会结构体和结构体排序的同学可能比较难懂。主要就是结构体+排序;
主要的部分:
struct student{ int c;//语文int m;//数学int e;//英语int tot;//总分int num;//序号}s[301];//学生的存储
当然本人提交时有偷懒,合并为int c, m, e, tot, num; :-)
敲重点!!结构体排序部分:
int student_comp(const student &a,const student &b){//两个结构体
if(a.tot>b.tot)return 1; if(a.tot<b.tot)return 0;//总分比较
if(a.c>b.c)return 1; if(a.c<b.c)return 0;//语文比较
if(a.num<b.num)return 1;//序号比较
return 0;
}
相信大家肯定都懂,就不多讲啦。 O(∩_∩)O~~
最后!附上完整代码:
#include<cstdio>#include<algorithm>using namespace std;int n;struct student{ int c,m,e,tot,num;//定义 }s[301];int student_comp(const student &a,const student &b){//两个结构体
if(a.tot>b.tot)return 1; if(a.tot<b.tot)return 0;//总分比较
if(a.c>b.c)return 1; if(a.c<b.c)return 0;//语文比较
if(a.num<b.num)return 1;//序号比较
return 0;
}int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d%d",&s[i].c,&s[i].m,&s[i].e);//语数英读入
s[i].tot=s[i].c+s[i].m+s[i].e;//总分计算
s[i].num=i+1;//序号
}//读入
sort(s+0,s+n,student_comp);//排序
for(int i=0;i<5;i++)printf("%d %d\n",s[i].num,s[i].tot);//输出 }
P.S.:看到我用sort请各位神犇勿喷,仅仅出于偷懒……
评论
还没有评论
评论
这道题比较简单,作为蒟蒻的我一遍AC了,这道题,就是赤裸裸的结构体+三级排序嘛
不多说,上代码
#include<cstdio>#include<iostream>#include<algorithm> using namespace std;struct cc
{ int all;//总分
int a;//语文
int b;//数学
int c;//英语
int num;//学号}g[301];bool cmp(cc x,cc y)//三级排序{ if(x.all>y.all) return 1;//如果总分可以比较
if(x.all==y.all)//反之
{ if(x.a>y.a)//如果语文分数可以比较
return 1; if(x.a==y.a)//反之
{ if(x.num<y.num)//比较学号
return 1;
}
} return 0;
}int main(){ int n; cin>>n;//输入
for(int i=1;i<=n;i++)
{ cin>>g[i].a>>g[i].b>>g[i].c;
g[i].num=i;//记录学号
g[i].all=g[i].a+g[i].b+g[i].c;//记录总分
}
sort(g+1,g+n+1,cmp);//三级排序
for(int i=1;i<=5;i++) cout<<g[i].num<<' '<<g[i].all<<endl;//输出}
最后,我得出一个结论——sort就是好用!!!
0.0分
39 人评分
C语言程序设计教程(第三版)课后习题4.9 (C++代码)浏览:2204 |
C二级辅导-统计字符 (C语言代码)浏览:529 |
Hello, world! (C语言代码)浏览:1318 |
人见人爱A+B (C语言代码)浏览:664 |
蛇行矩阵 (C语言代码)浏览:792 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:590 |
理财计划 (C语言代码)浏览:494 |
C二级辅导-统计字符 (C语言代码)浏览:695 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:871 |
陶陶摘苹果2 (C++代码)浏览:578 |