lalalala


私信TA

用户名:zhangshuo

访问量:161549

签 名:

像狗一样的学习,像绅士一样地玩耍。

等  级
排  名 7
经  验 31302
参赛次数 10
文章发表 201
年  龄 12
在职情况 学生
学  校 芜湖市第十一中学
专  业

  自我简介:

今日懒惰流下的口水,将会成为明日里伤心的泪水。

解题思路:





注意事项:





参考代码:

提供一种简洁的比较函数。

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 人评分

  评论区

  • «
  • »