stelayuri

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;
}

 

分类:

技术点:

相关文章:

  • 2021-12-21
  • 2021-05-29
  • 2021-05-19
  • 2021-05-31
  • 2021-05-26
  • 2021-10-15
  • 2022-01-31
  • 2021-12-23
猜你喜欢
  • 2021-05-31
  • 2021-11-18
  • 2022-12-23
  • 2021-12-08
  • 2021-06-30
  • 2021-11-21
  • 2022-12-23
相关资源
相似解决方案