タイトル:
思考作業や実験のプログラミングに用いられるリアルタイム評価システムは、時間内にランキングが得られるという特徴がありますが、その機能はどのように実現されているのでしょうか?
直接見るには耐えられなかったプログラムを入念に完成させて提出した後、評価システムはACエラーまたはその他のさまざまなエラーを返します。間違った方法が何であっても、常に表示されるメモが表示されます一度ここに穴が開けられ、何千時間も経過し、最後にACで処理された後、総勘定元帳が計算され、この質問が誤って数回提出されたことを示します。
長い川の中で、通過する問題の数は増えていますが、各問題を通過するのに費やした時間(最初から問題を通過するまでの時間)が記録されます。あなたの闘争の痕跡として。特に、あなたが合格した質問の場合、この質問に対して行った間違った提出はすべて、一定の単位時間ペナルティとしてカウントされます。そのため、あなたが作る質問の数で他の人よりも優先される場合がありますが、同じ数の質問をする人の中で、あなたは高いペナルティのためにランキングに不利になるかもしれません。
たとえば、試験には合計8つの質問(A、B、C、D、E、F、G、H)があります。各人の質問には、対応する質問番号の下に数量マークが付いています。間違った提出がありましたが、これまでACはありませんでした。正の数値は、ACが費やした時間を示します。正の数値aの後に2組の括弧があり、正の数値bがある場合、学生はこの問題を解答したことを意味します。時間がかかったaと同時にbが間違って提出した。例については、以下のサンプル入力および出力セクションを参照してください。
入力:
入力データには複数の行が含まれています。最初の行は質問の総数n(1≤n≤12)と単位ペナルティ時間m(10≤m≤20)です。後続の各データ行は生徒の情報を示し、最初の行は生徒の情報ですユーザー名(10文字以内の文字列)の後に、n個の質問すべての現在のステータスが続き、説明は問題の説明の数量マークの形式になります。
出力:
これらの学生のスコアの現在の状態に応じて、リアルタイムのランキングが出力されます。リアルタイムランキングは明らかにAC質問の数によって最初にランク付けされ、前に並べられ、次に時間順に並べられ、前に並べられていません。最初の2つが等しい場合は、名前順に辞書順で並べられ、小さい順に並べられます。 。各生徒は1行で、名前(幅10文字)、質問の数(幅2文字、右揃え)、時間(幅4文字、右揃え)を出力します。名前、質問の数、時間の間にスペースがあります。データは必要な出力フォーマットで出力されることが保証されています。
入力例:
8 20
GuGuDong 96 -3 40(3)0 0 1 -8 0
hrz 107 67 -3 0 0 82 0 0
TT 120(3)30 10(1)-3 0 47 21(2)-2
OMRailgun 0 -99 -8 0 -666 -10086 0 -9999996
yjq -2 37(2)13 -1 0 113(2)79(1)-1
Zjm 0 0 57(5)0 0 99(3)-7 0
出力例:
TT
5,348 yjq 4,342
GuGuDong 3,197
hrz
3,256
Zjm 2,316 OMRailgun 0 0
アイデア:
構成担当者を使用して、出場者の名前、AC質問の数、および消費された合計時間を記録します。
この質問の焦点は入力データの処理にあります。私の処理方法は次のとおりです。最初に名前を入力し、後続のデータはnサイクル(nは質問の総数)を通じて文字列入力として処理され、最初にそれが0より大きいかどうかを判断します。 0より大きい場合、次のステップが処理され、AC番号は+1になります。0未満の場合、処理されません。次に、str.size()-1の文字が右角かっこであるかどうかを判断し、そうであれば、sscanfを介して配列に入力し、計算します。そうでない場合は、合計値に直接追加し、最後にsumとacをpersonに格納しますpersonクラスの配列は、sortでソートされてから出力されます。
コード:
#include <iostream>
#include<string.h>
#include<string>
#include <vector>
#include<algorithm>
using namespace std;
struct person
{
string name;
long long ac, time;
long long allnum;
person(string thename, long long n)
{
allnum = n;
ac = 0;
time = 0;
name = thename;
}
};
bool cmp(person a, person b)
{
if (a.ac != b.ac)
{
return a.ac > b.ac;
}
else if (a.time != b.time)
{
return a.time < b.time;
}
else
{
return a.name < b.name;
}
}
int main()
{
long long n, m;
cin >> n >> m;
vector<person> a;
string name;
long long b[2];
while (cin>>name && name[0] != EOF)
{
person temp(name, n);
string str;
for (int i = 0; i < n; i++)
{
cin >> str;
if (str[str.size() - 1] == ')')
{
sscanf(str.c_str(), "%lld(%lld)", &b[0], &b[1]);
temp.ac++;
temp.time += (b[0] + b[1] * m);
}
else
{
sscanf(str.c_str(), "%lld", &b[0]);
if (b[0] > 0)
{
temp.ac++;
temp.time += b[0];
}
}
}
a.push_back(temp);
}
sort(a.begin(), a.end(), cmp);
for (vector<person>::iterator it = a.begin(); it != a.end(); it++)
{
printf("%-10s %2lld %4lld\n", it->name.c_str(), it->ac, it->time);
}
return 0;
}