首页 > 代码库 > zjut 1205

zjut 1205

按绩点排名  Time Limit:2000MS  Memory Limit:32768K

Description:

有一些班级的学生需要按绩点计算并排名。 每门课程的成绩只有在60分以上(含),才予以计算绩点。课程绩点的计算公式为: (课程成绩 – 50)÷10×学分数 一个学生的总绩点为其所有课程绩点总和除以10。

 

Input:

输入数据中含有一些班级(≤20)。 每个班级的第一行数据n(≤10),a1,a2,a3,…,an,表示该班级共有n门课程,每门课程的学分分别为a1,a2,a3,…,an; 班级数据中的第二行数据为一个整数m(≤50),表示本班级有m个学生; 班级数据接下去有m行对应m个学生数据; 每行学生数据中的第一个为字串s1(s1中间没有空格),表示学生姓名,后面跟有n个整数s1,s2,s3,…,sn,表示该学生各门课程的成绩(0≤si≤100)。

Output:

以班级为单位输出各个学生按绩点分从大到小的排名。如果绩点分相同,则按学生名字的ASCII串值从小到大排名。 每个班级的排名输出之前应先给出一行,描述班级序号“class #:”(#表示班级序号),班级之间应空出一行。 排名时,每个学生占一行,列出名字和总绩点。学生输出宽度为10个字符,左对齐,在空出一格后列出总绩点。

Sample Input:

13 3 4 33张三   89 62 71smith 98 50 80王五   67 88 91

Sample Output:

class 1:王五        3.26smith     2.34张三        2.28




#include <cstdio>#include <vector>#include <iostream>#include <algorithm>#include <string>#include <iomanip>using namespace std;struct student{    string s;    double d;};bool myComp(const student &s1,const student &s2){    if(s1.d!=s2.d) return s1.d>s2.d;    if(s1.s!=s2.s) return s1.s<s2.s;}int main(){    int n;//班级数量    int c;//课程数量    double xf;    vector<double>vxf;    int p;//班级人数    string name;//学生名称    double score;//成绩    student xs;//学生名称与总学分结构体    vector<student>vxs;    cin>>n;//n个班    for(int i=0;i<n;i++)//处理每一个班    {        cin>>c;        for(int j=0;j<c;j++)        {            cin>>xf;            vxf.push_back(xf);        }        cin>>p;        for(int k=0;k<p;k++)        {            cin>>name;//读入学生名称            xs.s=name;            xf=0.0;            for(int m=0;m<c;m++)            {                cin>>score;                if(score<60) continue;                xf+=(score-50)/10*vxf[m];            }            xs.d=xf/10;            vxs.push_back(xs);        }        //输出每一个班的情况        cout<<(i?"\n":"");        cout<<"class "<<i+1<<":"<<endl;        sort(vxs.begin(),vxs.end(),myComp);        for(vector<student>::iterator it=vxs.begin();it<vxs.end();it++)        {            cout<<fixed<<setprecision(2);            cout<<left<<setw(11);            cout<<(*it).s<<(*it).d<<endl;        }        vxf.clear();//清除向量        vxs.clear();//清除向量    }    return 0;}#include <iostream>#include <vector>#include <algorithm>#include <string>#include <queue>#include <iomanip>using namespace std;struct cj{ string name; double jd;}temp;bool cmp(cj a,cj b){ if(a.jd!=b.jd) return a.jd>b.jd; else if(a.name!=b.name) return a.name <b.name;}int main(int argc, char *argv[]){ int n,cl; cin >>n;//班级数  for(cl=1;cl<=n;cl++) {  vector<cj> s;//学生姓名和绩点   int j,m;  double t;  cin>>m;//科目数   vector<double> sc;//学分   for(j=0;j<m;j++)  {   cin>>t;   sc.push_back(t);  }  int i,q,k;  cin>>q;//学生人数   vector<double> ssc;//学生每课成绩   for (k=0;k<q;k++)//进行每个同学的信息录入   {   cin>>temp.name;   for(j=0;j<m;j++)   {    cin>>t;    ssc.push_back(t);   }   temp.jd=0;   for(j=0;j<m;j++)//进行绩点的计算    {    if(ssc[j]<60)continue;    temp.jd+=(ssc[j]-50.0)/10.0*sc[j];   }   ssc.clear();   temp.jd/=10;    s.push_back(temp);  }  sort(s.begin(),s.end(),cmp);  cout<<(cl==1?"":"\n");  cout<<"class "<<cl<<":"<<endl;  for(i=0;i<q;i++)   cout<<left<<setw(10)<<s[i].name<<" "<<fixed<<setprecision(2)<<s[i].jd<<endl;  sc.clear();s.clear(); } return 0;}