模拟题一道,两种sort+两种二分就过了,不过此题有个小小的trick,就是排名是按总分来排。
以下是代码:
- #include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N=30000; - struct stud
{
char name[50];
int mark;
int flag;
}p[N],*q[N];
char s[50];
int n,m; - bool cmp1(stud a,stud b)
{
return strcmp(a.name,b.name)<0;
} - bool cmp(stud *a,stud *b)
{
if(a->mark!=b->mark)
return b->mark<a->mark;
else return a->flag<b->flag;
} - 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;
}
- int main()