HDU1236排名(排序)

刚学会C++ STL标准模板库,就试着写了一道排序的题;发现C++ STL好强很大,虽然有许多函数调错了,但是经过调试过后,居然一次AC了,兴奋呀!

所以以此纪念一下这个小小的突破;嘿嘿……

好了,先看看题目吧!

题意:

今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的 
考生,并将他们的成绩按降序打印。 
http://acm.hdu.edu.cn/showproblem.php?pid=1236
题解:
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int num[11];//存储每个题的分数
typedef struct people
{
    string sno;
    int sum;
}people;//每个人的学号与总分
vector<people> vec;
bool cmp(people x1,people x2 )
{
    if(x1.sum==x2.sum)
    return(x1.sno<x2.sno);
    return(x1.sum>x2.sum);
}//排序,若分数相等对学号按升序排序,否则按分数降序排序;
int main()
{
    int i,j,n,m,g,m1,gnum,pass;//pass为通过的人数,gnum为每个学生做题的题号;m1为当前这个学生做了几题;
    people temp;//用于结构体型的向量元素插入时的中间变量;
    while(scanf("%d",&n),n)
    {
        vec.erase(vec.begin(),vec.end());//先清空向量
        pass=0;
        scanf("%d%d",&m,&g);
        for(i=1;i<=m;i++)
        {
            scanf("%d",&num[i]);
        }
        for(i=0;i<n;i++)
        {
            int sum1=0;
            cin>>temp.sno>>m1;
            for(j=1;j<=m1;j++)
            {
                scanf("%d",&gnum);
                sum1+=num[gnum];
            }
            if(sum1>=g)pass++;
            temp.sum=sum1;
            vec.push_back(temp);/在向量尾部插入;
        }
        printf("%d\n",pass);//输出通过的学生数
        sort(vec.begin(),vec.end(),cmp);//排序;
        for(vector<people>::iterator it=vec.begin();it!=vec.begin()+pass;it++)
        {
            cout<<it->sno<<' '<<it->sum<<endl;//输出
        }
    }
    return 0;
}



你可能感兴趣的:(排序)