刚学会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;
}