按绩点排名 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:
1 3 3 4 3 3 张三 89 62 71 smith 98 50 80 王五 67 88 91
Sample Output:
class 1: 王五 3.26 smith 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; }
时间: 2024-11-05 16:06:36