joj 2319

排序算法优化与应用

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;


struct stu{
       char name[11];//练习使用顺序表;
       double score;
       int list;}s[1005];
      

      
      
       int com0(struct stu p,struct stu q)//此处不同;
{
   
         return (strcmp(p.name,q.name));
   
}
int equal(double p,double q){
 
       if((fabs(p-q))<1e-6)
           return 1;
       else
           return 0;}

int com1(struct stu p,struct stu q){
     if(equal(p.score,q.score)==0&&p.score>q.score)
     return 1;
   
     return 0;}
    
 
   
int main(){ 
   
   
   


  int com0(struct stu p,struct stu q);
     int com1(struct stu p,struct stu q);       
  
    int n,m;
   
    while(scanf("%d%d",&n,&m)==2){
  
   
                                   
        int i,d=0;int h;
       
          
           
         
           
          
           
          for(i=0;i<n;i++){
                for(h=0;h<11;h++){s[i].name[h]='/0';}          
            scanf("%s%lf",s[i].name,&s[i].score);
         
             
              
             
           
               s[i].list=1;
     //输入所有的名字和分数
               }
                   d=n;
                  
    sort(s,s+d,com0);//sort()按名字;
  
    for(i=0;i<d-1;i++){
                          
           if(strcmp(s[i].name,s[i+1].name)==0){
                                                       
                s[i].score=(s[i].score+s[i+1].score)*0.50000;
           
          int q;
         
          for(q=i+1;q<d-1;q++){//很可能是这个循环出了问题
                                      
             s[q].score=s[q+1].score;
            
              s[q].list=s[q+1].list;
             
              strcpy(s[q].name,s[q+1].name);
              }
             
             d=d-1;
             }
         }//检查相邻的节点的名字是否相同;利用指针移动;并处理;
  
  
   
   
   
    stable_sort(s,s+d,com1);
   
 
   
   
    s[0].list=1;
   
    for(i=1;i<d;i++){
                        
       if(equal(s[i].score,s[i-1].score)==1)
      
          s[i].list=s[i-1].list;
       else
          s[i].list=s[i-1].list+1;}//sort()按分数; 并赋值给名次;相同的分数名次相同;
 
 
    int a,x;
    for(i=1;i<=m;i++){
                     
         scanf("%d",&x);
  
        int j;
        for(j=0;j<d;j++){
                            
             if(s[j].list==x){
                                 
                a=j;break;}
   
             a=-1;}
            
            
      if(a!=-1){
               
      printf("%s",s[a].name);
     
      while(1){
    a=a+1;
     
               if(a<d&&s[a].list==x){
               printf(" ");
                  printf("%s",s[a].name);}
                 
               else{
                    printf("/n");break;}}}
    
      else
      printf("Invalid/n");
      }//输出相应名次的 名字; 从下标==名次开始;找不到就输出invalin;
              
         }
        
    return 0;}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值