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 ",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 ",stu[i].name,stu[i].ac,stu[i].sum); return 0; }