自己写的一个。
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int r[N] = {1000,2000,1500,5000,3000,4000,2000,2500,888,1680};
double p[N][N];
string username[N] = {"1","2","3","4","5","6","7","8","9","10"};
struct u{
double seed;
int id,name,idx;
string user;
}x[N];
bool c(u x,u y){
return x.seed < y.seed;
}
int main(){
int all_rating = 0;
for (int i = 0; i < 10; i ++ ){
all_rating += r[i];
}
for (int i = 0; i < 10; i ++ ){
for (int j = 0; j < 10; j ++ ){
if (r[i] > r[j]){
p[i][j] = 1.0 / (1 + pow(10,1.0 * (r[i] - r[j]) / 400.0));
}
}
}
for (int i = 0; i < 10; i ++ ){
x[i].seed = 1;
for (int j = 0; j < 10; j ++ ){
if (i != j){
x[i].seed += p[j][i];
}
}
x[i].name = i + 1;
x[i].user = username[i];
x[i].idx = i;
}
sort(x,x + 10,c);
for (int i = 0; i < 10; i ++ ){
x[i].id = i + 1;
}
int max_rating = 1000,tt = all_rating;
for (int i = 0; i < 10; i ++ ){
if (x[i].id == x[i].name){
int bh;
if (x[i].name <= 10 / 2){
bh = 100 * (5 - x[i].name) / 2;
}
else{
bh = -100 * x[i].name / 2;
}
if (bh < -max_rating){
bh = -max_rating;
}
if (bh > max_rating){
bh = max_rating;
}
all_rating -= r[x[i].idx] + bh;
if (bh >= 0){
cout << x[i].user << " rating + " << bh << "!" << "now rating:" << r[x[i].idx] + bh << "!\n";
}
else{
cout << x[i].user << " rating - " << abs(bh) << "!" << "now rating:" << r[x[i].idx] + bh << "!\n";
}
}
else{
int t = x[i].id - x[i].name;
int bh;
if (t > 0){
bh = 0.4 * max_rating * t;
all_rating -= r[x[i].idx];
if (bh < -max_rating){
bh = -max_rating;
}
if (bh > max_rating){
bh = max_rating;
}
all_rating -= bh;
int ch = min(max_rating - bh,all_rating * all_rating / tt);
all_rating -= ch;
cout << x[i].user << " rating + " << bh + ch << "!" << "now rating:" << r[x[i].idx] + bh + ch << "!\n";
}
else{
bh = 0.3 * max_rating * t;
if (bh < -max_rating){
bh = -max_rating;
}
if (bh > max_rating){
bh = max_rating;
}
all_rating -= r[x[i].idx] + bh;
cout << x[i].user << " rating - " << abs(bh) << "!" << "now rating:" << r[x[i].idx] + bh << "!\n";
}
}
}
return 0;
}