PAT 1012 The Best Rank (25)

来源:互联网 发布:iphone吉他独奏软件 编辑:程序博客网 时间:2024/06/04 18:20

题目如下:就是找出每位同学自己四门功课C、M、E、A最好的一个排名,优先排名A>C>M>E



 代码如下,主要还是一个排序问题:

#include <iostream>#include <cstring>int sishe(float num);int min(int cp,int ma,int en,int av) ;using namespace std;int main(){string str[2001];int rank[2001][5]={0};int best[2001]={0};//存储每个同学最好功课代号 char gk[5]={' ','C','M','E','A'};int N,M;cin>>N>>M;int total_cp[101],total_ma[101],total_en[101],total_av[101];memset(total_cp,101,0);memset(total_ma,101,0);memset(total_en,101,0);memset(total_av,101,0);int cp[2001],ma[2001],en[2001],av[2001];memset(cp,2001,0);memset(ma,2001,0);memset(en,2001,0);memset(av,2001,0);for(int i=1;i<=N;i++){cin>>str[i]>>cp[i]>>ma[i]>>en[i];av[i]=sishe((cp[i]+ma[i]+en[i])/3.0);total_cp[cp[i]]++;//统计cp功课各个分数人数total_ma[ma[i]]++;//统计ma功课各个分数人数total_en[en[i]]++;//统计en功课各个分数人数total_av[av[i]]++;//统计av功课各个分数人数}for(int i=1;i<=N;i++){for(int j=cp[i]+1;j<=100;j++)rank[i][1]=rank[i][1]+total_cp[j];//统计第i位同学,cp功课排在他的前面有多少人 for(int j=ma[i]+1;j<=100;j++)rank[i][2]=rank[i][2]+total_ma[j];//统计第i位同学,ma功课排在他的前面有多少人 for(int j=en[i]+1;j<=100;j++)rank[i][3]=rank[i][3]+total_en[j];//统计第i位同学,en功课排在他的前面有多少人 for(int j=av[i]+1;j<=100;j++)rank[i][4]=rank[i][4]+total_av[j];//统计第i位同学,av功课排在他的前面有多少人 }for(int i=1;i<=N;i++)best[i]=min(rank[i][1],rank[i][2],rank[i][3],rank[i][4]);//找出第i位同学排名最靠前的一门功课 string ID[2001];for(int i=1;i<=M;i++)cin>>ID[i];for(int i=1;i<=M;i++){int j=1;for(;j<=N;j++){if(str[j]==ID[i]){cout<<rank[j][best[j]]+1<<' '<<gk[best[j]]<<endl;//此处 rank[j][best[j]]+1是因为他的前面有rank[j][best[j]]位同学,他出于排在下一位,有可能与很多人并列第多少名 break;}}if(j>N)cout<<"N/A"<<endl;}return 0;}int sishe(float num)//对得到的浮点数做四舍五入处理 {int temp=(int)(num*10);if(temp%10>=5)return (int)(temp/10)+1;elsereturn (int)num;}int min(int cp,int ma,int en,int av)//找出排名最靠前的一门功课 {if(en<ma&&en<cp&&en<av)return 3;else if(ma<=en&&ma<cp&&ma<av)return 2;else if(cp<=ma&&cp<=en&&cp<av)return 1;elsereturn 4;}




0 0
原创粉丝点击