题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093
本题即为字符串处理以及sscanf函数以及排序的应用.
sscanf函数的应用对此题有了很大帮助,方便快捷的得到字符串中的整形数据。
要先对姓名按字典排序,以应对AC的题数和罚时都相同的情况。
AC代码:
#include<iostream> using namespace std; #include<string.h> char s[1000][15]={0}; int A[1000]={0},B[1000]={0}; int main() { //freopen("d:\\1.txt","r",stdin); int n,m,i,j,l; int k=0; cin>>n>>m; char name[15],score[15][15],temp[15]; int t; while(scanf("%s",name)!=EOF) { int punish=0,k1=0;//punish代表罚时 k1代表AC题的个数 int a,b; strcpy(s[k],name); for(i=0;i<n;i++)//依次输入每个题的解题情况 { int p1=1,p2=1; scanf("%s",score[i]); l=strlen(score[i]); for(j=0;j<l;j++) if(score[i][0]=='-'||score[i][0]=='0'){p1=0;break;} else if(score[i][j]=='('){p2=0;break;} if(p1) { if(p2) { sscanf(score[i],"%d",&a); //sscanf punish+=a; } else { sscanf(score[i],"%d(%d)",&a,&b);//sscanf punish=punish+a+b*m; } k1++; } }//for A[k]=k1; B[k]=punish; k++;//计算学生的数目 }//while //接下来是排序 在此可以先测试一下输出结果 来判断做的是否正确 for(j=k-1;j>=0;j--)//j=k-1而别错写成n-1 for(i=0;i<j;i++) { if(strcmp(s[i],s[i+1])>0)//先按名字字典排序 { strcpy(temp,s[i]); strcpy(s[i],s[i+1]); strcpy(s[i+1],temp); t=A[i]; A[i]=A[i+1]; A[i+1]=t; t=B[i]; //真是的 把t错定义成char型的了 所以排序会出错 B[i]=B[i+1]; B[i+1]=t; } } for(j=k-1;j>=0;j--)//再按AC的题数从大到小排序 for(i=0;i<j;i++) { if(A[i]<A[i+1]) { strcpy(temp,s[i]); strcpy(s[i],s[i+1]); strcpy(s[i+1],temp); t=A[i]; A[i]=A[i+1]; A[i+1]=t; t=B[i]; B[i]=B[i+1]; B[i+1]=t; } } for(j=k-1;j>=0;j--) for(i=0;i<j;i++) { if(B[i]>B[i+1]&&A[i]==A[i+1])//按罚时从小到大排序 { strcpy(temp,s[i]); strcpy(s[i],s[i+1]); strcpy(s[i+1],temp); t=A[i]; A[i]=A[i+1]; A[i+1]=t; t=B[i]; B[i]=B[i+1]; B[i+1]=t; } } //输出最后结果 for(i=0;i<k;i++) { printf("%-10s %2d %4d",s[i],A[i],B[i]); cout<<endl; } return 0; }