1025. PAT Ranking

来源:互联网 发布:thunder mac 2.7.8 编辑:程序博客网 时间:2024/04/29 21:22

这一题:先对整体进行排序,在给每组进行排序。在对每组进行排序时要对记录每组的前一个值。

开头使用冒泡排序进行整体排序结果超时,技术菜的我只好使用sort,百度后才发现自定义cmp在false情况下进行交换。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define max(a,b) a>b?a:b#define min(a,b) a<b?a:busing namespace std;struct node{char name[14];int point;int frank;int lnum;int lrank;};bool cmp(node A,node B)//false情况下成立{    if(A.point==B.point)    if(strcmp(A.name,B.name)>0)    return false;    else return true;    else        return A.point>B.point;}void lsort(node b[],int k,int T){    int flag=0;    node last[301];//用于记录上一个每组元素,用于组内排名    int lnum[101]={0};//遍历时记录已遍历到每组的第几个数 用于组内排名    node text;    sort(b,b+k,cmp);    int num=1;    b[0].frank=1;    b[0].lrank=1;      last[b[0].lnum]=b[0];     lnum[b[0].lnum]++;    for(int i=1;i<k;i++)    {        num++;        lnum[b[i].lnum]++;        if(lnum[b[i].lnum]==1)        {                      b[i].lrank=1;                      last[b[i].lnum]=b[i];            }            else            {                if(b[i].point==last[b[i].lnum].point)                    b[i].lrank=last[b[i].lnum].lrank;                else                    b[i].lrank=lnum[b[i].lnum];                last[b[i].lnum]=b[i];            }        if(b[i].point==b[i-1].point)           b[i].frank=b[i-1].frank;        else          b[i].frank=num;    }    printf("%d\n",k);    for(int i=0;i<k;i++)            printf("%s %d %d %d\n",b[i].name,b[i].frank,b[i].lnum,b[i].lrank);}int main(){    int T;    int n;    node b[30000];    scanf("%d",&T);    int k=0;    for(int i=0;i<T;i++)    {        scanf("%d",&n);        for(int j=0;j<n;j++)        {              scanf("%s%d",&b[k].name,&b[k].point);        b[k++].lnum=i+1;        }    }lsort(b,k,T);    return 0;}


0 0
原创粉丝点击