题目链接:https://hpuoj.com/contest/24/problem/G/
输入格式
单组输入,第一行输入一个m(1≤m≤100),代表codancer参加的比赛的数量。
接下来对于每场比赛:
第一行输入一个整数n代表有n(1≤n≤100)个人参加的比赛。
接下来n行每行输入一个字符串和数字,代表参赛选手的用户名和他的rating,codancer即为他自己的用户名(用户名长度不超过20),假如输入的名字为codancer,则不用输入数字(其他参赛选手的rating是不会更新的,因为管理员太懒了)。
输出格式
输出codancer最终的rating,向上取整。
input
3
5
tourist 2000
capryang 1900
boctorio 1800
dicer 1800
codancer
2
codancer
rookie 200
2
wzy 1500
codancer
output
12
分析:很好的一道模拟题。按照题意进行模拟即可。
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node
{
char name[50];
double rating;
} q[1010];
int m,n;
double K(double x)
{
if(x<=1349)
return 15;
else if(x>=1350&&x<=1499)
return 20;
else if(x>=1500&&x<=1599)
return 25;
else if(x>=1600&&x<=1699)
return 30;
else if(x>=1700&&x<=1799)
return 35;
else if(x>=1800)
return 50;
}
double Rating(double rating)
{
double k=K(rating);//处于哪个等级
double EA=0,SA=0;
for(int i=0;i<n;i++)
{
if(strcmp(q[i].name,"codancer")==0)
continue;
EA+=1.0/(1.0+pow(10,((q[i].rating-rating)/400.0)));//获胜的期望
}
for(int i=0;i<n;i++)
{
if(strcmp(q[i].name,"codancer")==0)
{
SA=n-i-1;//赢了几个人
break;
}
}
double now=rating+k*(SA-EA);
return ceil(now);//向上取整,返回大于或等于now的最小整数
}
int main()
{
while(~scanf("%d",&m))
{
double KK_rating=0;//初始rating
while(m--)//m场比赛
{
scanf("%d",&n);//每场比赛n个人
for(int i=0; i<n; i++)
{
scanf("%s",&q[i].name);
if(strcmp(q[i].name,"codancer")==0)
{
q[i].rating=KK_rating;
continue;
}
scanf("%lf",&q[i].rating);
}
KK_rating=Rating(KK_rating);
}
printf("%.0lf\n",ceil(KK_rating));
}
return 0;
}