首页 > 试题广场 >

排名

[编程题]排名
  • 热度指数:3589 时间限制: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 <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<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<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)
害 结构体
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct node{
    string str;
    int number;
    int score[10];
    int sumscore;
}node;
bool cmp(node a, node b){
    if(a.sumscore < b.sumscore)
        return true;
    else if(a.sumscore == b.sumscore)
        return a.str > b.str;
    else
        return false;
}
int main(){
    int m,n,nscore;
    while(cin >> m >> n >> nscore){
        if(m == 0)
            break;
        int x[10];
        for(int i=0;i<n;++i)
            cin >> x[i];
        node t[1001];
        for(int i=0;i<n;++i){
            t[i].sumscore = 0;
            for(int j=0;j<10;++j)
                t[i].score[j] = 0;
        }
        for(int i=0;i<m;++i){
            cin >> t[i].str;
            cin >> t[i].number;
            for(int j=0;j<t[i].number;++j)
                cin >> t[i].score[j];
        }
        for(int i=0;i<m;++i){
            for(int j=0;j<t[i].number;++j){
                t[i].sumscore+=x[t[i].score[j]-1];
            }
        }
        sort(t,t+m,cmp);
        int temp = 0;
        for(int i=0;i<m;++i){
            if(t[i].sumscore>=nscore)
                temp++;
        }
        cout<<temp<<endl;
        for(int i=m-1;i>=0;--i){
            if(t[i].sumscore>=nscore){
                cout<<t[i].str<<' ';
                cout<<t[i].sumscore<<endl;
            }
        }
    }
    return 0;
}

编辑于 2020-02-26 15:44:38 回复(0)
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<cmath>

using namespace std;

struct Student {
	string no;
	int score;	//总分
}students[1000];

/*
	自定义比较函数
*/
int cmp(Student a , Student b) {
	if (a.score != b.score) {
		return a.score > b.score;
	}
	else {
		return a.no < b.no;
	}
}

int main() {

	int N, M, S;	//考场人数,考题数目,分数线
	int scores[10];		//分值
	int num;	//考生A题个数
	int temp;	//临时接收考生A题题号
	int count;	//过线考生个数

	while (cin >> N && N) {
		cin >> M >>S;
		for (int i = 0; i < M;i++) {
			cin >> scores[i];
		}
		//过线考生个数清零
		count = 0;
		for (int i = 0; i < N;i++) {
			cin >> students[i].no;
			cin >> num;

			//考生总分清零
			students[i].score = 0;
			//计算总分
			for (int j = 0; j < num;j++) {
				cin >> temp;
				students[i].score += scores[temp-1];
			}
			//判断过线否
			if (students[i].score >= S) {
				count++;
			}
		}
		//按照分数和考号相结合的方式排序
		sort(students , students + N,cmp);
		//输出过线考生信息
		cout << count << endl;
		for (int i = 0; i < count;i++) {
			cout << students[i].no << " " << students[i].score << endl;
		}
		
	}

	return 0;
}

发表于 2020-02-12 23:21:20 回复(0)
题目比较简单,考点为快速排序
#include <stdio.h> #include <string.h>
#include <stdlib.h>

struct StuNode{
    char sno[21];
    int goal;
}stu[1005];
int comp(const void *a,const void *b)
{
    if(((struct StuNode*)a)->goal <((struct StuNode*)b)->goal) return 1;
    else if(((struct StuNode*)a)->goal >((struct StuNode*)b)->goal) return -1;
    else{
        if(strcmp(((struct StuNode*)a)->sno,((struct StuNode*)b)->sno)>0) return 1;
        else return -1;
    }
}
int main()
{
    int n,m,g,score[11],t,index;
    while(~scanf("%d%d%d",&n,&m,&g))
    {
        if(n==0) break;
        for(int i=1;i<=m;i++) scanf("%d",&score[i]);
        for(int i=0;i<n;i++)
        {
            scanf("%s %d",stu[i].sno,&t);
            stu[i].goal=0;
            for(int j=0;j<t;j++)
            {
                scanf("%d",&index);
                stu[i].goal+=score[index];
            }
        }
        qsort(stu,n,sizeof(struct StuNode),comp);
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            if(stu[i].goal>=g) cnt++;
        }
        printf("%d\n",cnt);
        for(int i=0;i<cnt;i++)
        {
            printf("%s %d\n",stu[i].sno,stu[i].goal);
        }
    }
}




发表于 2020-02-11 18:25:33 回复(0)

问题信息

难度:
43条回答 5064浏览

热门推荐

通过挑战的用户

查看代码