タイトルリンク:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1339
トピック
acm競争システムは、最終的なペナルティ時間、n人、m個の質問を計算します。負の数-aiは失敗してai送信を試みたことを意味し、正の数aiは通過した時間を意味します。括弧がある場合は、数字biが含まれています。これは、以前にbi回失敗したため、ペナルティを計算するときに追加する必要があることを意味します。時間ai + bi * s、sはユニットペナルティを表します。最後に、10個のグリッドがパス数の降順で左揃えになり、2個のグリッドが時間ペナルティの昇順で右揃えになり、4個のグリッドが辞書式順序の昇順で配置され、出力結果が並べ替えられます。
アイデア
シミュレーション+並べ替え。負か0かを確認し、負の場合はスキップします。次に、括弧があるかどうかを確認し、括弧がある場合は追加の時間ペナルティを追加して、最後に並べ替えます。重要なのは、3つの数字の間に2つのスペースがあることです。忘れないでください!!!
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int cnt, score;
string name;
bool operator < (const node &a) const{
if(cnt != a.cnt) return cnt > a.cnt;
else if(score != a.score) return score < a.score;
return name < a.name;
}
}a[105];
int main(){
int m, s, n;
string b;
cin >> m >> s >> n;
for(int i = 1; i <= n; i ++){
a[i].cnt = 0, a[i].score = 0;
cin >> a[i].name;
for(int j = 1; j <= m; j ++){
cin >> b;
if(b[0] == '-' || b == "0") continue;
a[i].cnt ++;
int id = 0, l = b.length(), cc = 0, res = 0; // id表示左括号的位置,l表示字符串长度, res表示罚时,cc表示之前提交次数
while(id < l && b[id] != '(') id ++;
for(int k = 0; k < id; k ++){
res = res * 10 + b[k] - '0';
}
a[i].score += res;
if(id != l){
for(int k = id + 1; k < l - 1; k ++){
cc = cc * 10 + b[k] - '0';
}
a[i].score += cc * s;
}
}
}
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i ++){
int l = a[i].name.length();
cout << a[i].name;
for(int i = 0; i < 10 - l; i ++) cout << " ";
printf(" %2d %4d\n", a[i].cnt, a[i].score); //前面有两个空格的,呜呜呜
}
return 0;
}