首页 > 试题广场 >

排名

[编程题]排名
  • 热度指数:3878 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。

输入描述:
    测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。 
    当读入的考生人数为0时,输入结束,该场考试不予处理。


输出描述:
    对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。
示例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;
}

发表于 2019-01-24 14:23:14 回复(0)
Java 解法 
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);
            }
        }
    }
}


发表于 2020-03-17 10:38:11 回复(0)

Easy AC
#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;
}


发表于 2020-02-29 15:08:59 回复(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。
发表于 2020-02-11 15:39:50 回复(0)
#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;
}

发表于 2018-02-26 09:53:35 回复(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;
		}
	}
}

发表于 2025-03-20 08:16:42 回复(0)
#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;
        }
    }
}

发表于 2025-02-16 16:05:35 回复(0)
#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;
    }
}
模拟 无需多言
发表于 2024-12-29 19:08:52 回复(0)
真是服了,看漏的题目居然给出了答对题目的数量、我还搁那整半天如何读取非定长数据,不过也好、也积累了一些处理非定长字符串的读取和处理,
我直接将,答对题目数量的值忽略了。
#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;
        }
    }
}


发表于 2024-03-15 21:20:30 回复(0)
#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;
}


编辑于 2024-03-08 15:02:55 回复(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;
}

编辑于 2024-03-03 18:45:29 回复(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;
}

发表于 2023-03-24 14:03:53 回复(0)
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct Student{
    string name;
    int sum;
    int ques;
};
vector<Student> Myvec;
int value[12];
Student stu[1000];
bool CMP(Student a,Student b){
    if(a.sum==b.sum){
        return a.name<b.name;
    }else{
        return a.sum>b.sum;
    }
}
int main()
{
    int m,n,k;
    while(cin>>m>>n>>k){
        if(m==0){
            break;
        }
        for(int i=1;i<=n;i++){
            cin>>value[i];
        }
        for(int i=1;i<=m;i++){
            cin>>stu[i].name>>stu[i].ques;
            int number;
            int count=0;
            for(int j=0;j<stu[i].ques;j++){
                cin>>number;
                count+=value[number];
            }
            stu[i].sum=count;
        }
        for(int i=1;i<=m;i++){
            if(stu[i].sum>=k){
                Myvec.push_back(stu[i]);
            }
        }
        sort(Myvec.begin(),Myvec.end(),CMP);
        cout<<Myvec.size()<<endl;
        for(int i=0;i<Myvec.size();i++){
            cout<<Myvec[i].name<<" "<<Myvec[i].sum<<endl;
        }
        Myvec.clear();
    }
    return 0;
 }
发表于 2023-03-14 12:11:23 回复(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;
}

发表于 2021-03-16 16:26:54 回复(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;
}

发表于 2021-03-10 16:22:21 回复(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;
}

发表于 2020-07-29 14:19:53 回复(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;
}


发表于 2020-04-17 01:17:52 回复(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;
}


发表于 2020-03-12 10:00:19 回复(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);
        
    }
}

发表于 2020-03-01 13:53:59 回复(0)
出题的人是有多无聊
#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;
} 

发表于 2020-02-29 10:45:27 回复(0)

问题信息

难度:
46条回答 6026浏览

热门推荐

通过挑战的用户

查看代码
排名