ZJNU 1164 - 考试排名——中级
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJNU 1164 - 考试排名——中级相关的知识,希望对你有一定的参考价值。
1、如果一个单元为0,表示没做过这题,不计入成绩
2、如果一个单位为负数,表示做错了这题,不计入成绩
所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩
将名字和成绩都当作字符串读入,方便处理含有括号的情况
字符串读入后检查末尾是否为‘)‘即可分开判断有无括号的情况(如果有括号,成绩一定存在)
为了方便可以用 结构体/自定义函数/排序自定义compare函数 来实现
当然,不使用结构体可以用普通数组代替
不使用algorithm库的sort可以用冒泡选择这两种基本排序做(不会存在卡时间的情况)
做法1:C/无结构体/无sort
1 /* 2 Written By StelaYuri 3 On 2019/08/22 4 */ 5 #include<stdio.h> 6 #include<string.h> 7 int main(){ 8 int i,u,p,n,m,tm[10000],ac[10000],poi=0,tmd,wtd,id,dt; 9 char nm[10000][11],cd[11],k; 10 scanf("%d%d",&n,&m); 11 while(scanf("%s",nm[poi])!=EOF){ 12 tm[poi]=0; 13 ac[poi]=0; 14 for(i=0;i<n;i++){ 15 scanf("%d",&dt); 16 if(dt>0){ 17 ac[poi]++; 18 tm[poi]+=dt; 19 scanf("%c",&k); 20 if(k==‘(‘){ 21 scanf("%d%*c",&dt); 22 tm[poi]+=dt*m; 23 } 24 } 25 } 26 poi++; 27 } 28 for(i=0;i<poi;i++)//排序 29 for(u=poi-1;u>i;u--) 30 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){ 31 id=ac[u]; 32 ac[u]=ac[u-1]; 33 ac[u-1]=id; 34 id=tm[u]; 35 tm[u]=tm[u-1]; 36 tm[u-1]=id; 37 strcpy(cd,nm[u]); 38 strcpy(nm[u],nm[u-1]); 39 strcpy(nm[u-1],cd); 40 } 41 for(i=0;i<poi;i++) 42 printf("%-10s %2d %4d ",nm[i],ac[i],tm[i]); 43 44 return 0; 45 }
做法2:C++/结构体/sort
1 /* 2 Written By StelaYuri 3 */ 4 #include<cstdio> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 struct node{ 9 char name[15]; 10 int sum,ac; 11 }stu[10000]; 12 int m; 13 char dat[15]; 14 int getDigit(int l,int r){ 15 int i=l,res=0,f=1; 16 if(dat[i]==‘-‘){ 17 f=-1; 18 i++; 19 } 20 for(;i<r;i++) 21 res=res*10+dat[i]-‘0‘; 22 return f*res; 23 } 24 int getDScore(int len){ 25 int i; 26 for(i=0;i<len;i++) 27 if(dat[i]==‘(‘) 28 break; 29 return getDigit(0,i)+m*getDigit(i+1,len-1); 30 } 31 bool cmp(node a,node b){ 32 if(a.ac!=b.ac) 33 return a.ac>b.ac; 34 if(a.sum!=b.sum) 35 return a.sum<b.sum; 36 return strcmp(a.name,b.name)==-1; 37 } 38 int main(){ 39 int n,i,t=0,len,d; 40 scanf("%d%d",&n,&m); 41 while(scanf("%s",stu[t].name)!=EOF){ 42 for(i=1;i<=n;i++){ 43 scanf("%s",dat); 44 len=strlen(dat); 45 if(dat[len-1]!=‘)‘){ 46 d=getDigit(0,len); 47 if(d>0){ 48 stu[t].sum+=d; 49 stu[t].ac++; 50 } 51 } 52 else{ 53 stu[t].sum+=getDScore(len); 54 stu[t].ac++; 55 } 56 } 57 t++; 58 } 59 sort(stu,stu+t,cmp); 60 for(i=0;i<t;i++) 61 printf("%-10s %2d %4d ",stu[i].name,stu[i].ac,stu[i].sum); 62 63 return 0; 64 }
以上是关于ZJNU 1164 - 考试排名——中级的主要内容,如果未能解决你的问题,请参考以下文章