poj 2153

本文介绍了一个简单的比赛排名系统的实现过程,使用了排序和二分搜索算法。系统首先按姓名对参赛者进行排序,并为特定名字设置标记。之后,通过输入分数更新参赛者的得分并重新排序以确定最新排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     模拟题一道,两种sort+两种二分就过了,不过此题有个小小的trick,就是排名是按总分来排。

      以下是代码:

 

 

  1. #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    const int N=30000;
  2. struct stud
    {
     char name[50];
     int mark;
     int flag;
    }p[N],*q[N];
    char s[50];
    int n,m;
  3. bool cmp1(stud a,stud b)
    {
     return strcmp(a.name,b.name)<0;
    }
  4. bool cmp(stud *a,stud *b)
    {
     if(a->mark!=b->mark)
      return b->mark<a->mark;
     else return a->flag<b->flag;
    }
  5. int BSearch(char *a)
    {
        int l=1,r=n;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(strcmp(a,p[mid].name)<0)
            {
                r=mid-1;
            }
            else if(strcmp(a,p[mid].name)==0)return mid;
            else
            {
                l=mid+1;
            }
        }
        return l;
    }
    • int main()
      {
       int i,j,k,rec;
       int a,b;
       scanf("%d",&n);getchar();
       for(i=1;i<=n;i++)
       {
        gets(p[i].name);  
        if(strcmp(p[i].name,"Li Ming")==0) {p[i].flag=0;}
        else p[i].flag=1;
        p[i].mark=0;
       }
       sort(p+1,p+n+1,cmp1);
       for(i=1;i<=n;i++)
       {
        if(strcmp(p[i].name,"Li Ming")==0) rec=i;
        q[i]=&p[i];
       }
       scanf("%d",&m);
       for(i=1;i<=m;i++)
       {
        for(j=1;j<=n;j++)
        {
         scanf("%d ",&a);
         gets(s);
         int x=BSearch(s);
         p[x].mark+=a;
        }
        sort(q+1,q+n+1,cmp);
        int find=p[rec].mark;
        int low=1,high=n,ans=1;
        
    • while(low<=high)
        {
         int mid=(low+high)/2;
         if(q[mid]->mark==find) {ans=mid;break;}
         if(q[mid]->mark<find) high=mid-1;
         else low=mid+1;
        }
        
    • for(j=ans;j>=1;j--)
         if(strcmp(q[j]->name,"Li Ming")==0)
         {
          printf("%d/n",j);break;
         }
       }
       return 0;
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值