結果
| 問題 |
No.447 ゆきこーだーの雨と雪 (2)
|
| コンテスト | |
| ユーザー |
TonyMooori
|
| 提出日時 | 2016-11-18 23:25:25 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 18 ms / 2,000 ms |
| コード長 | 2,523 bytes |
| コンパイル時間 | 1,867 ms |
| コンパイル使用メモリ | 178,992 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-26 08:37:47 |
| 合計ジャッジ時間 | 3,080 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define N_PRIME 1000000007
#define ll int64_t
typedef struct _data_t{
string name;
bool solved[32];
int time;
int points[32];
int sum;
double sort_num;
bool operator<( const _data_t& right ) const {
return sort_num < right.sort_num;
}
} data_t;
data_t make_empty(){
data_t dat;
dat.name = "";
for(int i = 0 ; i < 32 ; i++ ){
dat.points[i] = 0;
dat.solved[i] = false;
}
dat.time = 0;
dat.sum = 0;
dat.sort_num = 0.0;
return dat;
}
int f(int n,int k){
return 50 * n + int(250 * n/(4+k));
}
int main(void){
int N;
cin >>N;
int n_star[N];
for(int i = 0 ; i < N ; i++ )
cin >> n_star[i];
int T;
int rank[N];
for(int i = 0 ; i < N ; i++ )
rank[i] = 1;
cin >> T;
vector<data_t> datas;
map< string, int > name_index;
for(int i = 0 ; i < T ; i++ ){
string username,pname;
cin >> username >> pname;
int pn = ((int)(pname[0]))-(int)'A';
if( name_index.find(username) == name_index.end()) {
name_index[ username ] = datas.size();
data_t dat = make_empty();
dat.name = username;
dat.solved[pn] = true;
dat.time = i;
dat.points[pn] = f( n_star[pn] , rank[pn] );
rank[pn]++;
datas.push_back(dat);
}else{
int index = name_index[ username ];
if( datas[index].solved[pn] != false )continue;
//cout << "---" << username << pn << "*--" << datas[index].solved[pn] << endl;
datas[index].solved[pn] = true;
datas[index].time = i;
datas[index].points[pn] = f( n_star[pn] , rank[pn] );
rank[pn]++;
}
}
for(int i = 0; i < datas.size() ; i++ ){
for(int j = 0 ; j < N ; j++ )
datas[i].sum += datas[i].points[j];
// timeは小さいとスコアが上がる→でかいと減る
datas[i].sort_num = datas[i].sum - datas[i].time / 5000.0;
}
sort(datas.begin(),datas.end());
reverse(datas.begin(),datas.end());
for(int i = 0; i < datas.size() ; i++ ){
cout << i+1 << " " << datas[i].name << " ";
for(int j = 0 ; j < N ; j++ ){
cout << datas[i].points[j] << " ";
}
cout << datas[i].sum << endl;;
}
return 0;
}
TonyMooori