ZOJ 3705 Applications (模拟)

96 篇文章 0 订阅
7 篇文章 0 订阅

题意:

按照各种条件计算一个申请加入集训队的分数,输出前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);
	}

   } 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值