说到底是一道稳定排序的题,题目也不说明白,真闹心,就是说当分数相同的时候序号要按字典序升序排列,那么cmp函数就应该多加一步了,代码如下:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
typedef struct stdent{
string num;
int grade;
}stu;
bool cmp(const stu &a,const stu &b)
{
if(a.grade==b.grade)
return a.num<b.num?true:false;
return a.grade>b.grade;
}
int main()
{
int n,m,g;
while(cin>>n&&n!=0){
stu t;
vector<stu> s;
cin>>m>>g;
int line[10];
for(int i=0;i<m;i++) cin>>line[i];
for(int i=0;i<n;i++){
int k,tg;
t.grade=0;
cin>>t.num>>k;
for(int j=0;j<k;j++){
cin>>tg;
t.grade+=line[tg-1];
}
if(t.grade>=g)
s.push_back(t);
}
int len=s.size();
sort(s.begin(),s.end(),cmp);
cout<<s.size()<<endl;
for(int i=0;i<s.size();i++) cout<<s[i].num<<" "<<s[i].grade<<endl;
}
return 0;
}