题意:
按照各种条件计算一个申请加入集训队的分数,输出前m高的申请者。
解题思路:
模拟做着就行。。。。就是公式内的除法是小数除,虽然给的都是整数,但却是小数除,比较坑。
还有就是注意Janpanjam要的是第三高 的分数;
最后如果分数相等要按字典序排序。
代码:
#include <bits/stdc++.h>
using namespace std;
struct acmer
{
char nam[133];
double scor;
}ap[1505];
struct contest
{
char nam[133];
int place;
}team[1505];
int thre[1505];
int on[1505];
int s, n, m, r, q;
double jam[1005];
bool cmp(acmer a, acmer b)
{
if(abs(a.scor-b.scor)>0.0001) return a.scor>b.scor;
else return strcmp(a.nam, b.nam)<0;
}
bool Find1(int id)
{
int i;
for(i=0; i<r; i++)if(id==thre[i])return true;
return false;
}
bool Find2(int id)
{
int i;
for(i=0; i<s; i++)if(id==on[i])return true;
return false; } bool isprime(int x)
{
int i;
for(i=2; i<=sqrt(x); i++)
if(x%i==0)return false;
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d%d", &n, &m, &r);
int i, j;
for(i=0; i<r; i++)
{
scanf("%d", &thre[i]);
}
scanf("%d", &s);
for(i=0; i<s; i++)
{
scanf("%d", &on[i]);
}
scanf("%d", &q);
for(i=0; i<q; i++)
{
scanf("%s %d", team[i].nam, &team[i].place);
}
char temnam[133];
char sex[3];
int p, c;
int id, scor;
for(i=0; i<n; i++)
{
scanf("%s", ap[i].nam);
ap[i].scor=0.0;
scanf("%s", temnam);
for(j=0; j<q; j++)
{
if(strcmp(team[j].nam, temnam)==0)
{
if(team[j].place==1)ap[i].scor+=36.0;
if(team[j].place==2)ap[i].scor+=27.0;
if(team[j].place==3)ap[i].scor+=18.0;
break;
}
}
scanf("%s", sex);
if(sex[0]=='F')ap[i].scor+=33.0;
scanf("%d%d", &p, &c);
for(j=0; j<p; j++)
{
scanf("%d", &id);
if(Find1(id))ap[i].scor+=2.5;
else if(Find2(id))ap[i].scor+=1.5;
else if(isprime(id))ap[i].scor+=1.0;
else ap[i].scor+=0.3;
}
for(j=0; j<c; j++)
{
scanf("%lf", &jam[j]);
}
for(int k=0; k<3; k++)
{
int index=k;
for(j=k+1; j<c; j++)
{
if(jam[j]>jam[index])
{
index=j;
}
}
swap(jam[index], jam[k]);
}
if(c>2)ap[i].scor+=max(0.0, (jam[2]-1200)/100*1.5);
}
sort(ap, ap+n, cmp);
for(i=0; i<m; i++)
{
printf("%s %.3f\n", ap[i].nam, ap[i].scor);
}
}
}