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 20HintHuge input, scanf is recommended.
结构体,快排的练习。
代码如下:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct student { char name[30]; int x; //通过的个数 int grade; }pre[1111]; bool cmp(student a,student b) { if (a.grade==b.grade) { if (strcmp(a.name,b.name)==-1) return 1; else return 0; } else { return a.grade>b.grade; } } int main() { int n,m,g; //考生数,科目数,分数线 int pg[15]; //单科分数 int t; //临时变量 int cot; //通过考试的人数 while (~scanf ("%d",&n) && n) { memset(pre,0,sizeof(pre)); memset(pg,0,sizeof(pg)); scanf ("%d %d",&m,&g); for (int i=1;i<=m;i++) { scanf ("%d",&t); pg[i]=t; } for (int i=0;i<n;i++) { scanf ("%s",pre[i].name); pre[i].grade=0; scanf ("%d",&pre[i].x); for (int j=1;j<=pre[i].x;j++) { scanf ("%d",&t); pre[i].grade+=pg[t]; } } sort(pre,pre+n,cmp); //按成绩排名 ,成绩相同学号升序 for (cot=0;cot<n;cot++) { if (pre[cot].grade<g) { break; } } printf ("%d\n",cot); for (int i=0;i<cot;i++) { printf ("%s %d\n",pre[i].name,pre[i].grade); } } return 0; }