分析: 多条件排序 + 数据统计
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <vector>
#include <iomanip>
#include <algorithm>
//#include "myAlgorithm.h"
#define MAXL 1000005
#define INF 1e8
using namespace std;
int n;
int a[MAXL];
struct Stu{
char num[30];
int score;
}stu[1005];
bool cmp1(Stu a, Stu b){
if(a.score != b.score)
return a.score < b.score;
return (strcmp(a.num, b.num) >= 0);
}
bool cmp2(Stu a, Stu b){
if(a.score != b.score)
return a.score > b.score;
return (strcmp(a.num, b.num) <= 0);
}
int partion(int low, int high){
Stu key = stu[low];
while(low < high){
while(low < high && cmp1(key, stu[high])){
high--;
}
swap(stu[low], stu[high]);
while(low < high &&!cmp1(key, stu[low])){
low ++;
}
swap(stu[low], stu[high]);
}
return low;
}
void quickSort(int low, int high){
if(low < high){
int mid = partion(low, high);
quickSort(low, mid -1);
quickSort(mid + 1, high);
}
}
int N, M, G;
int Pro[15];
int m;
bool isPro[15];
int main()
{
///freopen("in.txt","w",stdout);
while(cin>>N, N){
cin>>M>>G;
for( int i = 1; i<=M; i++){
cin>>Pro[i];
}
for( int i = 0; i < N; i++){
cin>>stu[i].num>>m;
int p, score = 0;
for( int j = 1; j <= m; j++){
cin>>p;
score += Pro[p];
}stu[i].score = score;
}///stu input end;
quickSort(0, N - 1);
int count = 0;
for( int i = N- 1; i >= 0; i--){
if(stu[i].score >=G)
count++;
}
cout<<count<<endl;
for( int i = N - 1; i >= N - count; i--){
cout<<stu[i].num<<" "<<stu[i].score<<endl;
}
}
return 0;
}