トピックの概要
例えば、8つの質問(A、B、C、D、E、F、G、H)の合計として、各作ら質問が負の数に対応した問題数のマーカーの数は、学生のタイトルを示す持ってテストされています間違った番号を提出したが、今まではAC、AC正の数が正の数が正の数bを持つ一対のブラケット、に追いつくためにならば、時間の消費量は、それが学生の交流、この質問を意味していることを示していませんでした、それは同時に提出し、bは間違った時間を持っていた時間を消費します。例としては、以下の入力および出力サンプルセクションを見ることができます。
入力出力
入力
入力データが複数の行を含む場合、最初の行は、共通のタイトル番号n(1≤n≤12)と単位ペナルティM(10≤m≤20)、学生情報の記述後のデータの各行、最初の学生でありますユーザ名(これ以上10文字の文字列よりは)質問マークの数に記載のフォーマットを説明し、すべてのn個の状態スコアは、上記の表を参照の質問に続いていません。
出力
ランキングリアルタイムのこれらの学生スコアリング出力の状態によります。リアルタイムランキングは明らかにACプレス行の数は、より前者よりも、その後、どのくらいの時間点の列、小さなフロントが起こった前にどのくらいの問題の両方が等しい場合、プレス辞書編集行の名前、最小の最初のものです。各行ごとの学生、出力名(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
問題解決のためのアイデア
このため、問題の1は、このような構造のステュ比較動作や過負荷の定義、ランキング、複数のキーワードが必要です。
2.各質問のために記録されたスコア文字配列[]学生のスコア、交流が別々に計算時刻とタイムペナルティを定義します。AC時間:それがある場合に最初の配列要素は、判定された「 - 」ではない「0」であれば番号が(アップ追加する前に、それは「(」ACの対象とし、次に文字列を横切る、しなければならない)ペナルティ。左括弧場合、括弧は括弧内の数字を足し、左から右括弧の文字の配列を通過します。
3.ソートソート最後に。
コード
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
//定义student结构体,并重写比较操作
struct Stu{
int a,b;//a为AC题数,b为时间
char name[10];
bool operator< (const Stu &stu) const{
if(a!=stu.a) return a>stu.a;
if(b!=stu.b) return b<stu.b;
return strcmp(name,stu.name)<0;//字典序升序
}
}st[100005];
int n,m; //n为题数(1<=n<=12),m为单位罚时(10<=m<=20)
int k=0; //k用于记录学生个数
char score[1000];//存储学生每道题的得分情况
int main()
{
cin>>n>>m;
while(~scanf("%10s",st[k].name))
{
st[k].a=0;
st[k].b=0;
for(int i=0;i<n;i++)
{
cin>>score;
if(score[0]!='-'&&score[0]!='0')
{
st[k].a++; //计算AC的题目个数
int label=0,num=0;
for(int j=0;j<strlen(score);j++)
{//此轮for循环计算ac时间
if(score[j]=='(')
{
label=j; //若有括号,label用于记录左括号的位置
break;
}
num=num*10+score[j]-'0';//计算AC的时间
}
st[k].b+=num;
num=0;
if(label)
{
for(int j=label+1;j<strlen(score)-1;j++)
{//此轮for循环计算罚时
num=num*10+score[j]-'0';
}
}
st[k].b+=num*m;
}
}
k++;
sort(st,st+k);
}
for(int i=0;i<k;i++)
{
printf("%-10s %2d %4d\n",st[i].name,st[i].a,st[i].b);
// cout<<setw(10)<<setfill(' ')<<st[i].name<<" "<<setw(2)<<setiosflags(ios::right)<<st[i].a<<" "<<setw(4)<<setiosflags(ios::right)<<st[i].b<<endl;
}
return 0;
}
概要
出力をフォーマットに関して1.、ちょうど、setw、そしてどのようにprintfの%プラス、それの幅を忘れてcoutを忘れないでください!!正のデフォルト右揃え、左揃え負を、忘れないでください!!
2.この質問はポイント...愚かな比較:ループ出力における最終結果!!単純にするときの例の最後のセットを確認し、同じサンプリングし、前回のn-1回の変更の出力に払う注意をしませんでした...はげ頭は間違っている...幸いなことに、学生は再びそれを行うことは決してありませんことを思い出したのか分からないん...