ZJNU 1164 - 考试排名——中级

1、如果一个单元为0,表示没做过这题,不计入成绩

2、如果一个单位为负数,表示做错了这题,不计入成绩

所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩

将名字和成绩都当作字符串读入,方便处理含有括号的情况

字符串读入后检查末尾是否为')'即可分开判断有无括号的情况(如果有括号,成绩一定存在)

为了方便可以用 结构体/自定义函数/排序自定义compare函数 来实现

当然,不使用结构体可以用普通数组代替

不使用algorithm库的sort可以用冒泡选择这两种基本排序做(不会存在卡时间的情况)

 

做法1:C/无结构体/无sort

#include<stdio.h>
#include<string.h>
int main(){
    int i,u,n,m,tm[10000],ac[10000],poi=0,id,dt;
    char nm[10000][11],cd[11],k;
    scanf("%d%d",&n,&m);
    while(scanf("%s",nm[poi])!=EOF){
        tm[poi]=0;
        ac[poi]=0;
        for(i=0;i<n;i++){
            scanf("%d",&dt);
            if(dt>0){
                ac[poi]++;
                tm[poi]+=dt;
                scanf("%c",&k);
                if(k=='('){
                    scanf("%d%*c",&dt);
                    tm[poi]+=dt*m;
                }
            }
        }
        poi++;
    }
    for(i=0;i<poi;i++)//排序
        for(u=poi-1;u>i;u--)
            if(ac[u]>ac[u-1]||ac[u]==ac[u-1]&&tm[u]<tm[u-1]||ac[u]==ac[u-1]&&tm[u]==tm[u-1]&&strcmp(nm[u-1],nm[u])>0){
                id=ac[u];
                ac[u]=ac[u-1];
                ac[u-1]=id;
                id=tm[u];
                tm[u]=tm[u-1];
                tm[u-1]=id;
                strcpy(cd,nm[u]);
                strcpy(nm[u],nm[u-1]);
                strcpy(nm[u-1],cd);
            }
    for(i=0;i<poi;i++)
        printf("%-10s %2d %4d\n",nm[i],ac[i],tm[i]);
    
    return 0;
}

 

 

做法2:C++/结构体/sort

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
    char name[15];
    int sum,ac;
}stu[10000];
int m;
char dat[15];
int getDigit(int l,int r){
    int i=l,res=0,f=1;
    if(dat[i]=='-'){
        f=-1;
        i++;
    }
    for(;i<r;i++)
        res=res*10+dat[i]-'0';
    return f*res;
}
int getDScore(int len){
    int i;
    for(i=0;i<len;i++)
        if(dat[i]=='(')
            break;
    return getDigit(0,i)+m*getDigit(i+1,len-1);
}
bool cmp(node a,node b){
    if(a.ac!=b.ac)
        return a.ac>b.ac;
    if(a.sum!=b.sum)
        return a.sum<b.sum;
    return strcmp(a.name,b.name)==-1;
}
int main(){
    int n,i,t=0,len,d;
    scanf("%d%d",&n,&m);
    while(scanf("%s",stu[t].name)!=EOF){
        for(i=1;i<=n;i++){
            scanf("%s",dat);
            len=strlen(dat);
            if(dat[len-1]!=')'){
                d=getDigit(0,len);
                if(d>0){
                    stu[t].sum+=d;
                    stu[t].ac++;
                }
            }
            else{
                stu[t].sum+=getDScore(len);
                stu[t].ac++;
            }
        }
        t++;
    }
    sort(stu,stu+t,cmp);
    for(i=0;i<t;i++)
        printf("%-10s %2d %4d\n",stu[i].name,stu[i].ac,stu[i].sum);
    
    return 0;
}

 

posted @ 2020-01-25 21:03  StelaYuri  阅读(187)  评论(0)    收藏  举报