patA1012 The Best Rank(有个段错误)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
char map[6]={'0','A','C','M','E'};


struct student{
char id[20];
int c_score,m_score,e_score,a_score; 
int rankc,rankm,ranke,ranka;
}S[2005];
bool cmpA(student a,student b){
if(a.a_score!=b.a_score) return a.a_score>b.a_score;
}
bool cmpC(student a,student b){ 
    if(a.c_score!=b.c_score) return a.c_score>b.c_score;

bool cmpM(student a,student b){
if(a.m_score!=b.m_score) return a.m_score>b.m_score;
}
bool cmpE(student a,student b){
if(a.e_score!=b.e_score) return a.e_score>b.e_score;
}
//get the best ranking 
int get_rank(int a,int b,int c,int d){
int min=a;
// if(min>a) min=a;
if(min>b) min=b;
if(min>c) min=c;
if(min>d) min=d;
return min;



int main(int argc, char** argv) {
int n,m;
scanf("%d %d",&n,&m);
// getchar();
for(int i=0;i<n;i++){
scanf("%s %d %d %d",S[i].id,&S[i].c_score,&S[i].m_score,&S[i].e_score);
S[i].a_score=round((S[i].c_score+S[i].m_score+S[i].e_score)/3)+0.5;
}
/**
对各门成绩进行ranking; 
*/
//测试输入的数据:
// printf("test:\n");
// for(int i=0;i<n;i++){
// printf("%s %d %d %d\n",S[i].id,S[i].c_score,S[i].m_score,S[i].e_score); 
//
sort(S,S+n,cmpA);// rank average
S[0].ranka=1; 
for(int i=1;i<n;i++){
if(S[i-1].a_score==S[i].a_score) S[i].ranka=S[i-1].ranka;
else S[i].ranka=i+1;
}

sort(S,S+n,cmpC); //rank c

S[0].rankc=1; 
for(int i=1;i<n;i++){
if(S[i-1].c_score==S[i].c_score) S[i].rankc=S[i-1].rankc;
else S[i].rankc=i+1;
}
sort(S,S+n,cmpM); //rank  m

S[0].rankm=1; 
for(int i=1;i<n;i++){
if(S[i-1].m_score==S[i].m_score) S[i].rankm=S[i-1].rankm;
else S[i].rankm=i+1;
}

sort(S,S+n,cmpE); //rank e

S[0].ranke=1; 
for(int i=1;i<n;i++){
if(S[i-1].e_score==S[i].e_score) S[i].ranke=S[i-1].ranke;
else S[i].ranke=i+1;
}
// init();
// printf("%d\n",S[0].ranke);
// printf("%d\n",S[1].ranke); 
// printf("%d\n",S[2].ranke);
// printf("%d\n",S[3].ranke);
getchar();                            //w a
// m=m+1; //***********//
while(m--){    //output 
char str[20];
gets(str);
// puts(str); 
// printf("%d\n",strlen(str));
int key=-1;



for(int i=0;i<n;i++){
int flag=0;
for(int j=0;j<strlen(str);j++){
if(str[j]!=S[i].id[j]) flag=1;
}
if(flag==0) {
key=i;     break;


}


 
// printf("%d\n",key);
if(key==-1) printf("N/A\n");
else{
int ans=get_rank(S[key].ranka,S[key].rankc,S[key].rankm,S[key].ranke);
// printf("%d",ans);
int Rank;
if(ans==S[key].ranka) Rank=1;
else if(ans==S[key].rankc) Rank=2;
else if(ans==S[key].rankm) Rank=3;
else if(ans==S[key].ranke) Rank=4;
      printf("%d %c\n",ans,map[Rank]);
}
}
return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值