- 李嘉轩 的博客
新款OI积分计算器
- 2024-11-25 13:29:20 @
此计算器的分数计算公式基于 这里 @ 提供的公式。
本来只有单人的,要改成多人,又懒得重构,于是加了一大堆 per[pp].
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
char c;
struct contest{
double c, k;
int year, score, lx;
double res;
};
struct person{
string name;
double maxn[9], maxp[9], dqf[9], ans1, ans2, ans3, ans4;
int last[9], qzm[9];
vector<contest>v;
person(){
for(int i = 1; i <= 8; i++)maxn[i] = maxp[i] = dqf[i] = last[i] = qzm[i] = ans1 = ans2 = ans3 = ans4 = 0;
v.clear();
}
}per[10001];
bool cmp(contest a, contest b){return a.year < b.year;}
int main(){
string name, s;
int id, x, y, lx, pc = 0;
cout << "新款OI积分计算器(4种模式)\n按1确认";
while(1){
c = _getch();
if(c == '1')break;
}
system("cls");
cout << "请输入每个人的名字,输入end完成\n";
for(int i = 1; i <= 10000; i++){
cout << "#" << i << " ";
cin >> name;
if(name == "end")break;
per[i].name = name;
pc = i;
}
system("cls");
cout << "请按[人ID 比赛名 年份 分数]格式输入每次比赛\n比赛名仅限CSP-J,CSP-S,NOIP,WC,APIO,NOI-SC,NOI,IOI\n输入0 end 0 0完成\n";
for(int i = 1; i <= pc; i++)cout << "#" << i << " " << per[i].name << "\n";
while(1){
cin >> id >> s >> x >> y;
if(s == "end"){
if(id == 0 && x == 0 && y == 0)break;
else cout << "输入错误\n";
}else if(id < 1 || id > pc)cout << "输入错误\n";
else if(s == "CSP-J")per[id].v.push_back({0.75, 0.998, x, y, 1});
else if(s == "CSP-S")per[id].v.push_back({0.8, 0.9975, x, y, 2});
else if(s == "NOIP")per[id].v.push_back({0.85, 0.9975, x, y, 3});
else if(s == "WC")per[id].v.push_back({0.88, 0.997, x, y, 4});
else if(s == "APIO")per[id].v.push_back({0.88, 0.997, x, y, 5});
else if(s == "NOI-SC")per[id].v.push_back({0.88, 0.9985, x, y, 6});
else if(s == "NOI")per[id].v.push_back({1, 0.9965, x, y, 7});
else if(s == "IOI")per[id].v.push_back({2, 0.997, x, y, 8});
else cout << "输入错误\n";
}
system("cls");
for(int pp = 1; pp <= pc; pp++){
sort(per[pp].v.begin(), per[pp].v.end(), cmp);
for(int i = 0; i < per[pp].v.size(); i++){
per[pp].v[i].res = per[pp].v[i].year * per[pp].v[i].c / pow(per[pp].v[i].k, per[pp].v[i].score);
per[pp].ans1 += per[pp].v[i].res;
lx = per[pp].v[i].lx;
per[pp].maxn[lx] = max(per[pp].maxn[lx], per[pp].v[i].res);
per[pp].maxp[lx] = per[pp].v[i].res;
if(per[pp].last[lx] == 0)per[pp].last[lx] = per[pp].v[i].year;
per[pp].dqf[lx] += per[pp].v[i].res * (1 << (per[pp].v[i].year - per[pp].last[lx]));
per[pp].qzm[lx] = (1 << (per[pp].v[i].year - per[pp].last[lx] + 1)) - 1;
}
for(int i = 1; i <= 8; i++)per[pp].ans2 += per[pp].maxn[i];
for(int i = 1; i <= 8; i++)per[pp].ans3 += per[pp].maxp[i];
for(int i = 1; i <= 8; i++)per[pp].ans4 += per[pp].dqf[i] / max(per[pp].qzm[i], 1);
}
for(int pp = 1; pp <= pc; pp++){
cout << "#" << pp << " " << per[pp].name << "\n";
printf("总和模式:%.2lf\n最大模式:%.2lf\n最近模式:%.2lf\n带权模式:%.2lf\n\n", per[pp].ans1, per[pp].ans2, per[pp].ans3, per[pp].ans4);
}
return 0;
}