测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。 当读入的考生人数为0时,输入结束,该场考试不予处理。
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。
4 5 25 10 10 12 13 15 CS004 3 5 1 3 CS003 5 2 4 1 3 5 CS002 2 1 2 CS001 3 2 3 5 1 2 40 10 30 CS001 1 2 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 0
3 CS003 60 CS001 37 CS004 37 0 1 CS000000000000000002 20
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct E{
char xuehao[25];
int score;
}buf[1000];
int a[10];
bool cmp(E a,E b){
if(a.score!=b.score){
return a.score>b.score;
}
else{
int temp=strcmp(a.xuehao,b.xuehao);
return temp<0;
}
}
int main(){
int n,m,g;
while(scanf("%d%d%d",&n,&m,&g)!=EOF){
if(n==0){
break;
}
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
int tihao,k;
int sum=0;
scanf("%s%d",buf[i].xuehao,&k);
for(int j=1;j<=k;j++){
scanf("%d",&tihao);
sum=sum+a[tihao];
}
buf[i].score=sum;
}
sort(buf,buf+n,cmp);
int count=0;
for(int i=0;i<n;i++){
if(buf[i].score>=g){
count++;
}
else{
break;
}
}
printf("%d\n",count);
for(int i=0;i<count;i++){
printf("%s %d\n",buf[i].xuehao,buf[i].score);
}
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
// 考生人数
int n = scanner.nextInt();
// 题目数
int m = scanner.nextInt();
// 分数线
int g = scanner.nextInt();
int[] scores = new int[m];
for (int i = 0; i < m; i++) scores[i] = scanner.nextInt();
ArrayList<String> list = new ArrayList<>();
int pass = 0;
for (int i = 0; i < n; i++) {
// 考生编号
String id = scanner.next();
// 通过的题目数
int j = scanner.nextInt();
int sum = 0;
for (int k = 0; k < j; k++) sum += scores[scanner.nextInt() - 1];
if (sum >= g) {
pass++;
list.add(id + " " + sum);
}
}
if (pass == 0) System.out.println("0");
else {
System.out.println(pass);
Collections.sort(list, (o1, o2) -> {
String[] s1 = o1.split(" ");
String[] s2 = o2.split(" ");
return s1[1].equals(s2[1]) ? s1[0].compareTo(s2[0]) : -s1[1].compareTo(s2[1]);
});
for (String s : list) System.out.println(s);
}
}
}
}
#include <bits/stdc++.h>
using namespace std;
typedef struct{
string x;
int y;
}Student;
typedef struct{
string x;
int sum;
}Result;
Result resultstu[1010];
int q=0;
void result(Student student,int sum){
resultstu[q].x=student.x;
resultstu[q].sum=sum;
q++;
}
bool cmp(Result a,Result b){
if(a.sum>b.sum) return true;
else if(a.sum==b.sum) {
if(a.x.compare(b.x)<0)
return true;
else
return false;
}
else return false;
}
int main(){
int n,m,g,M[15],z,sum;
Student student[1010];
cin>>n>>m>>g;
for(int i=1;i<=m;i++){
cin>>M[i];
}
for(int i=1;i<=n;i++){
cin>>student[i].x>>student[i].y;
sum=0;
for(int j=1;j<=student[i].y;j++){
cin>>z;
sum+=M[z];
}
if(sum>=g){
result(student[i],sum);
}
}
sort(resultstu,resultstu+q,cmp);
cout<<q<<endl;
for(int i=0;i<q;i++){
cout<<resultstu[i].x<<" "<<resultstu[i].sum<<endl;
}
return 0;
}
#include <stdio.h>
#include <string.h>
typedef struct stu
{
char num[21];
int sum;
}stu;
int cmp(stu *a,stu *b)
{
if((b->sum)!=(a->sum))return b->sum-a->sum; //按分数从高到低输出上线考生的考号与分数
else return strcmp(a->num,b->num); //若有多名考生分数相同,则按他们考号的升序输出(从小到大)
}
int main()
{
int N,M,G;
while(scanf("%d%d%d",&N,&M,&G)!=EOF && N!=0)
{
int mark[M],temps,t,solvenum,count=0;
stu a[N];
for(int i=0;i<M;i++)scanf("%d",&mark[i]);
for(int i=0;i<N;i++)
{
temps=0;
scanf("%s%d",a[i].num,&solvenum);
for(int j=0;j<solvenum;j++)
{
scanf("%d",&t);
temps+=mark[t-1];
}
a[i].sum=temps;
if(temps>=G)count++;
}
qsort(a,N,sizeof(stu),cmp);
printf("%d\n",count);
for(int i=0;i<count;i++)printf("%s %d\n",a[i].num,a[i].sum);
}
} 纯C。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 1000
#define M 11
#define LEN 21
using namespace std;
struct info{
char id[LEN];//准考证号
int score;//该学生总分
}stu[N];
bool cmp(info a, info b)//排序规则
{
if(a.score!=b.score) return a.score>b.score;
else return strcmp(a.id, b.id)<0;
}
int main()
{
int n, m, line;//人数、科目数、分数线
int bonus[M];//每道题的分值
int winner;//过线人数
while(EOF!=scanf("%d", &n))
{
if(n==0) break;
scanf("%d%d", &m, &line);
for(int i=1; i<=m; i++)
{
scanf("%d", &bonus[i]);
}
for(int i=0; i<n; i++)
{
scanf("%s%d", stu[i].id, &m);
stu[i].score=0;
int x;
while(m--)
{
scanf("%d", &x);
stu[i].score+=bonus[x];
}
}
sort(stu, stu+n, cmp);//按既定规则排名次
winner=0;//过线人数,准备统计一下
for(int i=0; i<n; i++)
{
if(stu[i].score>=line) winner++;
else break;
}
printf("%d\n", winner);
for(int i=0; i<winner; i++)
{
printf("%s %d\n", stu[i].id, stu[i].score);
}
}
return 0;
} #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct student{
string id;
int amount;
int sum_score;
};
bool compare(student lhs, student rhs){
if(lhs.sum_score > rhs.sum_score){
return true;
}else if(lhs.sum_score == rhs.sum_score){
int min_id=min(lhs.id.length(),rhs.id.length());//排序考号
for(int i=0;i<min_id;i++){
if(lhs.id[i]<rhs.id[i]){//考生号排序
return true;
}else if(lhs.id[i]>rhs.id[i]){
return false;
}
}
if(lhs.id.length()==min_id){//考生号有一个更短且所有位相等,则更短的排在前面
return true;
}else{
return false;
}
}else{
return false;
}
}
int main(){
int n,m,g;//学生人数,考题数,分数线
while(cin >> n >> m >> g){
vector<int> score(m);
for(int i=0;i<m;i++){//每道题的分值
cin >> score[i];
}
vector<student> stuvec(n);
int count=0;//过分数线的考生人数
for(int i=0;i<n;i++){
int sum=0,mid;//mid是考生做对的题号,中间变量
cin >> stuvec[i].id >> stuvec[i].amount;
for(int j=0;j<stuvec[i].amount;j++){
cin >> mid;
sum+=score[mid-1];
}
if(sum>=g){
count++;//统计过线人数
}
stuvec[i].sum_score=sum;
}
sort(stuvec.begin(),stuvec.end(),compare);
//输出
cout << count << endl;
for(int i=0;i<count;i++){
cout << stuvec[i].id << ' ' << stuvec[i].sum_score << endl;
}
}
} #include <iostream>
#include <utility>
using namespace std;
#include "vector"
#include "algorithm"
struct Student{
string id;//学号
vector<int>problem_num;//解决问题的题号
int score;//获得的分数
Student()= default;
Student(string id):id(std::move(id)){}
};
bool cmp(Student a,Student b){
if(a.score==b.score){
return a.id<b.id;
}
return a.score>b.score;
}
int main() {
int N,M,G;
while(cin>>N>>M>>G){
if(N==0) break;
vector<int>scores(M);
int socre;
for(int i=0;i<M;i++){//录入每道题的分数
cin>>socre;
scores[i]=socre;
}
vector<Student>students(N);
for(int i=0;i<N;i++){
string id;
int solution_count;//解决问题的数量
cin>>id>>solution_count;
auto stu = Student(id);
int temp_score=0;
for(int i=0;i<solution_count;i++){//录入题号,算分数
int question_num; cin>>question_num;
temp_score+=scores[question_num-1];
}
stu.score=temp_score;//录入分数
students[i]=stu;//录入学生
}
sort(students.begin(),students.end(),cmp);//排序
int beyond_num=0;//超过分数线的人数
for(auto&a:students){
if(a.score>=G)
beyond_num++;
}
cout<<beyond_num<<endl;
for(auto&a:students){
if(a.score>=G)
cout<<a.id<<" "<<a.score<<endl;
}
}
} #include <bits/stdc++.h>
using namespace std;
struct stu {
string id;
int score;
};
bool cmp(stu a, stu b) {
if (a.score != b.score)
return a.score > b.score;
else
return a.id < b.id;
}
int main() {
int n, m, g;
while (cin >> n >> m >> g) { // 注意 while 处理多个 case
if (n == 0) break;
int ti[m + 1];
for (int i = 1; i <= m; i++)
cin >> ti[i];
vector<stu> v;
for (int i = 1; i <= n; i++) {
stu tmp;
cin >> tmp.id;
int n;
cin >> n;
int score = 0;
while (n--) {
int tmp;
cin >> tmp;
score += ti[tmp];
}
tmp.score = score;
v.push_back(tmp);
}
sort(v.begin(), v.end(), cmp);
int cnt = 0;
for (int i = 0; i < v.size(); i++)
if (v[i].score >= g) cnt++;
cout << cnt << endl;
for (int i = 0; i < v.size(); i++)
if (v[i].score >= g) cout << v[i].id << " " << v[i].score << endl;
}
} 模拟 无需多言
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct Student{
string id;
vector<int> prob;
int res;
} Student;
bool compare(Student s1,Student s2){
return s1.res>s2.res;
}
void ProcessSInfo(Student &s,string info){
s.res = 0;
int index = info.find(' ');
s.id = info.substr(0,index);
info.erase(0,index+3);
while(info.find(' ')!=-1){
index = info.find(' ');
string num = info.substr(0,index);
s.prob.push_back(stoi(num));
info.erase(0,index+1);
}
s.prob.push_back(stoi(info));
}
int main(){
int N,M,G;
while(scanf("%d%d%d",&N,&M,&G)!=EOF){
if(N==0) break;
map<int,int> Score;
for(int i=1;i<=M;i++){
int s;
scanf("%d",&s);
Score[i] = s;
}
char c;
scanf("%c",&c);
vector<Student> vec;
for(int i=0;i<N;i++){
string str;
getline(cin,str);
Student s;
ProcessSInfo(s,str);
vec.push_back(s);
}
for(int i=0;i<vec.size();i++){
for(int j=0;j<vec[i].prob.size();j++){
vec[i].res+=Score[vec[i].prob[j]];
}
}
int count = 0;
sort(vec.begin(),vec.end(),compare);
for(int i=0;i<vec.size();i++){
if(vec[i].res>=G){
count++;
}
}
printf("%d\n",count);
for(int i=0;i<count;i++){
cout<<vec[i].id<<" "<<vec[i].res<<endl;
}
}
} #include <bits/stdc++.h>
#define Student pair<string,int>
using namespace std;
bool compare(Student s1, Student s2) {
if (s1.second != s2.second) return s1.second > s2.second;
else return s1.first < s2.first;
}
int main() {
int nStu, mProblem, gScore;
cin >> nStu >> mProblem >> gScore;
vector<int> values(mProblem + 1);
for (int i = 1; i <= mProblem; i++) cin >> values[i];
int solved, pid, passed = 0;
vector<Student> stus(nStu);
for (int i = 0; i < nStu; i++) {
cin >> stus[i].first >> solved;
int score = 0;
for (int j = 0; j < solved; j++) {
cin >> pid;
score += values[pid];
}
if (score >= gScore) passed++;
stus[i].second = score;
}
cout << passed << endl;
sort(stus.begin(), stus.end(), compare);
for (int i = 0; i < passed; i++)
cout << stus[i].first << " " << stus[i].second << endl;
return 0;
} #include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Student {
string id; //考号
int score = 0; //分数
bool operator<(const Student& stu) {
return score > stu.score || (score == stu.score && id < stu.id);
}
};
int main() {
int n, m, g;
while (cin >> n && n) {
cin >> m >> g;
vector<int>score(m + 1); //每道题的分值
for (int i = 1; i <= m; i++) {
cin >> score[i];
}
vector<Student>stu(n);
for (auto& stu : stu) {
cin >> stu.id;
int m; //该生解决的题目总数
cin >> m;
while (m--) {
int number; //题号
cin >> number;
stu.score += score[number];
}
}
sort(stu.begin(), stu.end());
int count; //不低于分数线的人数
for (count = 0; stu[count].score >= g; count++);
cout << count << endl;
for (int i = 0; i < count; i++) {
cout << stu[i].id << " " << stu[i].score << endl;
}
}
return 0;
} #include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
struct stu{
string no;//准考证号
int points;//总分
};
bool cmp(stu a,stu b){
if(a.points==b.points){
return a.no<b.no;
}
return a.points>b.points;
}
int main() {
int n,m,g,mpoints[13],pass;
while(cin>>n>>m>>g){
pass=0;//统计过线人数
stu s[n];
//输入各题分值
for(int i=1;i<=m;i++){
cin>>mpoints[i];
}
//输入考生
for(int i=0;i<n;i++){
int slove,sum=0,temp;//slove记录该考生通过的题目数量,sum记录该考生总分
cin>>s[i].no>>slove;
for(int j=0;j<slove;j++){
cin>>temp;
sum+=mpoints[temp];
}
s[i].points=sum;
if(sum>=g) pass++;//统计过线的人
}
//排序
sort(s,s+n,cmp);
//输出
cout<<pass<<endl;
for(int i=0;i<pass;i++){
cout<<s[i].no<<" "<<s[i].points<<endl;
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000;
const int MAXM = 10;
int score[MAXM];
struct Student {
string id;
int m;
int order[MAXM];
int sum;
bool operator< (const Student s) const {
if (sum == s.sum) {
return id < s.id;
}
return sum > s.sum;
}
};
Student student[MAXN];
int main() {
int N, M, G;
while (cin >> N >> M >> G) {
if (N == 0) {
break;
}
for (int i = 0; i < M; ++i) {
cin >> score[i];
}
for (int i = 0; i < N; ++i) {
cin >> student[i].id;
cin >> student[i].m;
student[i].sum = 0;
for (int j = 0; j < student[i].m; ++j) {
cin >> student[i].order[j];
student[i].sum += score[student[i].order[j] - 1];
}
}
sort(student, student + N);
int number = 0;
for (int i = 0; i < N; ++i) {
if (student[i].sum >= G) {
number++;
}
}
cout << number << endl;
if (number > 0) {
for (int i = 0; i < N; ++i) {
if (student[i].sum >= G) {
cout << student[i].id << " " << student[i].sum << endl;
}
}
}
}
return 0;
} #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
struct node{
string id;
vector<int> solve;
int score = 0;
};
bool cmp(node a, node b){
if(a.score != b.score) return a.score > b.score;
else return a.id < b.id;
}
int main(){
int n, m, g;
while(cin >> n){
if(n == 0) break;
cin >> m >> g;
int problem[m];
for(int i = 0; i < m; i++){
cin >> problem[i];
}
node stu[n];
int num, cnt = 0;
for(int i = 0; i < n; i++){
cin >> stu[i].id;
cin >> num;
while(num--){
int tmp;
cin >> tmp;
stu[i].solve.push_back(tmp - 1);
stu[i].score += problem[tmp - 1];
}
if(stu[i].score >= g) cnt++;
}
sort(stu, stu + n, cmp);
cout << cnt << endl;
for(int i = 0; i < n; i++){
if(stu[i].score >= g){
cout << stu[i].id << " " << stu[i].score << endl;
}
else break;
}
}
return 0;
} #include <stdio.h>
#include <string.h>
int main()
{
int n,m,g,fz[11],i,j,c,s,sum[1000],t,acn,th[10];
char a[1000][21],temp[21],num[21];
while(scanf("%d%d%d",&n,&m,&g)!=EOF&&n>0) //n总人数 m总题数 g分数线
{
c=0;
for(i=1;i<=m;i++) scanf("%d",&fz[i]); //每道题的分值
for(i=0;i<n;i++)
{
s=0;
scanf("%s%d",num,&acn); //输入题号和解决题数
for(j=0;j<acn;j++)
{
scanf("%d",&th[j]);
s+=fz[th[j]]; //计算分值
}
if(s>=g) //若得分不小于分数线
{
strcpy(a[c],num);
sum[c]=s;
c++; //计数
}
}
printf("%d\n",c);
for(i=0;i<c;i++)
{
for(j=i+1;j<c;j++)
{
if(sum[i]<sum[j])
{
t=sum[i],sum[i]=sum[j],sum[j]=t;
strcpy(temp,a[i]),strcpy(a[i],a[j]),strcpy(a[j],temp);
}
else if(sum[i]==sum[j]&&strcmp(a[i],a[j])>0)
{
t=sum[i],sum[i]=sum[j],sum[j]=t;
strcpy(temp,a[i]),strcpy(a[i],a[j]),strcpy(a[j],temp);
}
}
}
for(i=0;i<c;i++) printf("%s %d\n",a[i],sum[i]);
}
return 0;
} #include <bits/stdc++.h>
using namespace std;
int main()
{
auto cmp=[](pair<string,int> p1,pair<string,int> p2){return p1.second==p2.second?p1.first>p2.first:p1.second<p2.second;};
int n,m,g;
while(cin>>n>>m>>g)
{
vector<int> scores(m+1);
for(int j=1;j<=m;++j)cin>>scores[j];
priority_queue<pair<string,int>,vector<pair<string,int> >,decltype(cmp)> students(cmp);
for(int i=0;i<n;++i)
{
pair<string,int> p("s",0);
cin>>p.first;
int num;
cin>>num;
for(int j=0;j<num;++j)
{
int no;
cin>>no;
p.second+=scores[no];
}
if(p.second>=g)students.push(p);
}
cout<<students.size()<<endl;
while(!students.empty())
{
pair<string,int> p=students.top();
students.pop();
cout<<p.first<<" "<<p.second<<endl;
}
}
return 0;
} #include<iostream>
(720)#include<string>
#define N 1000
(2243)#define M 11
using namespace std;
typedef struct student{
string id; //准考证号
int score; //总分
}stu;
int course[M];
stu people[N];
void sort(stu people[],int n){
stu temp;
int i,j;
for(i=1;i<n;i++){
temp = people[i];
for(j=i-1;j>=0;j--){
if(temp.score>people[j].score)
people[j+1]=people[j];
else if(temp.score==people[j].score && temp.id<people[j].id)
people[j+1]=people[j];
else
break;
}
people[j+1]=temp;
}
}
int main(){
int n,m,g;
while(scanf("%d %d %d",&n,&m,&g)!=EOF && n!=0){
string stuid;
int above=0;//记录上线人数
int k;//标识当前考生过线数目
int a;//当前考生的过线科目号
int sum = 0;
for(int i=1;i<=m;i++){
scanf("%d",&course[i]);
}
for(int i=0;i<n;i++){
cin>>stuid;
cin>>k;
sum=0;
for(int j=0;j<k;j++){
cin>>a;
sum=sum+course[a];
}
if(sum>=g){
people[above].id=stuid;
people[above].score = sum;
above++;
}
}
sort(people,above);
printf("%d\n",above);
for(int i=0;i<above;i++){
cout<<people[i].id<<" "<<people[i].score<<endl;
}
}
return 0;
} #include<stdio.h>
struct stu{
char No[21];
int score;
};
int main(){
int N,M,G;
while(~scanf("%d%d%d",&N,&M,&G)&&N){
int Part[M];
char s[21];
int a,x;
int cnt=0;
int all;
for(int i=0;i<M;i++)
scanf("%d",&Part[i]);
struct stu Stu[N];
for(int i=0;i<N;i++){
all=0;
scanf("%s%d",s,&a);
for(int j=0;j<a;j++){
scanf("%d",&x);
all+=Part[x-1];
}
if(all>=G){
strcpy(Stu[cnt].No,s);
Stu[cnt].score=all;
cnt++;
}
}
int flag;
struct stu tmp;
for(int i=0;i<cnt-1;i++){
flag=0;
for(int j=0;j<cnt-1-i;j++)
if(Stu[j].score<Stu[j+1].score||Stu[j].score==Stu[j+1].score&&strcmp(Stu[j].No,Stu[j+1].No)>0){
tmp=Stu[j];
Stu[j]=Stu[j+1];
Stu[j+1]=tmp;
flag=1;
}
if(!flag)
break;
}
printf("%d\n",cnt);
for(int i=0;i<cnt;i++)
printf("%s %d\n",Stu[i].No,Stu[i].score);
}
} #include<bits/stdc++.h>
using namespace std;
struct stu{
string id;
int score;
}buf[1000];
int main()
{
int n,m,g,num,p;
while(cin>>n>>m>>g)
{
if(!n) break;
vector<int> score(m);
int count=0;
for(int i=0;i<m;++i)
cin>>score[i];
for(int j=0;j<n;++j)
{
cin>>buf[j].id;
cin>>num;
buf[j].score=0;
while(num--)
{
cin>>p;
buf[j].score+=score[p-1];
}
if(buf[j].score>=g) count++;
}
sort(begin(buf),begin(buf)+n,[](stu p,stu q){
return p.score==q.score?p.id<q.id:p.score>q.score;});
cout<<count<<endl;
for(int i=0;i<n&&buf[i].score>=g;++i)
cout<<buf[i].id<<" "<<buf[i].score<<endl;
}
return 0;
}