测试输入包含若干场考试的信息。每场考试信息的第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; }