比赛 20121106 评测结果 AAAAAAAAAAAA
题目名称 H 指数因子 最终得分 100
用户昵称 王者自由 运行时间 0.012 s
代码语言 C++ 内存使用 3.15 MiB
提交时间 2012-11-06 09:26:46
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100 + 10;
struct gakusha {
    int h;
    string t;
    inline bool operator < (const gakusha x) const {
        return h == x.h ? t < x.t : h > x.h;
    }
} e[N];
int n, m, p[N];
map<string, int> s;
string a[N];
vector<int> v[N];
inline bool bigger(int x, int y) {
    return x > y;
}
int main() {
    freopen("publish.in", "r", stdin);
    freopen("publish.out", "w", stdout);
    scanf("%d\n", &n);
    char c[N];
    for(int i=0; i<n; i++) {
        scanf("%s\n", c);
        a[i] = c;
        if(s.find(a[i]) == s.end()) {
            s[a[i]] = m;
            e[m].t = a[i]; m++;
        }
    }
    for(int i=0; i<n; i++) {
        scanf("%s\n", c);
        for(int j=0; j<n; j++)
            if(i != j) p[j] += c[j] - '0';
    }
    for(int i=0; i<n; i++)
        if(p[i]) v[s[a[i]]].push_back(p[i]);
    int k, l[N];
    for(int i=0; i<m; i++) {
        sort(v[i].begin(), v[i].end(), bigger);
        fill_n(l, k = v[i].size(), 0);
        l[0] = k ? 1 : 0;
        for(int j=1; j<k; j++)
            l[j] += l[j-1] + (v[i][j] > j); 
        e[i].h = *max_element(l, l+k);
        for(int j=0; j<k; j++)
            fprintf(stderr, "(%d)%d[%d] ", j, v[i][j], l[j]);
        fprintf(stderr, "\n");
    }
    sort(e, e+m);
    for(int i=0; i<m; i++)
        printf("%s %d\n", e[i].t.c_str(), e[i].h);
    return 0;
}