题目链接: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 codanceroutput
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; }