刚学会C++ STL标准模板库,就试着写了一道排序的题;发现C++ STL好强很大,虽然有许多函数调错了,但是经过调试过后,居然一次AC了,兴奋呀!
所以以此纪念一下这个小小的突破;嘿嘿……
好了,先看看题目吧!
题意:
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
题解:
#include<cstdio> #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int num[11];//存储每个题的分数 typedef struct people { string sno; int sum; }people;//每个人的学号与总分 vector<people> vec; bool cmp(people x1,people x2 ) { if(x1.sum==x2.sum) return(x1.sno<x2.sno); return(x1.sum>x2.sum); }//排序,若分数相等对学号按升序排序,否则按分数降序排序; int main() { int i,j,n,m,g,m1,gnum,pass;//pass为通过的人数,gnum为每个学生做题的题号;m1为当前这个学生做了几题; people temp;//用于结构体型的向量元素插入时的中间变量; while(scanf("%d",&n),n) { vec.erase(vec.begin(),vec.end());//先清空向量 pass=0; scanf("%d%d",&m,&g); for(i=1;i<=m;i++) { scanf("%d",&num[i]); } for(i=0;i<n;i++) { int sum1=0; cin>>temp.sno>>m1; for(j=1;j<=m1;j++) { scanf("%d",&gnum); sum1+=num[gnum]; } if(sum1>=g)pass++; temp.sum=sum1; vec.push_back(temp);/在向量尾部插入; } printf("%d\n",pass);//输出通过的学生数 sort(vec.begin(),vec.end(),cmp);//排序; for(vector<people>::iterator it=vec.begin();it!=vec.begin()+pass;it++) { cout<<it->sno<<' '<<it->sum<<endl;//输出 } } return 0; }